que operator mayor con comparar cero java jsp el bigdecimal

java - operator - Comprobando si un valor BigDecimal es cero en una expresión EL de JSP



java bigdecimal mayor a cero (5)

Con la última versión de EL (compatible con Tomcat 7 por ejemplo), puedes probar:

<c:if test="${someBigDecimal.doubleValue() == 0}">

Lo siguiente no siempre se comporta como cabría esperar:

<c:if test="${someBigDecimal == 0}">

Si someBigDecimal tiene un valor de 0, pero tiene una escala distinta de 0, la operación == devuelve falso. Es decir, devuelve true cuando someBigDecimal es nuevo BigDecimal ("0"), pero false cuando someBigDecimal es nuevo BigDecimal ("0.00").

Esto se debe a las especificaciones JSP 2.0, 2.1 y 2.2, que establecen:

Para <,>, <=,> =:

Si A o B es BigDecimal, obligue a A y B a BigDecimal y use el valor de retorno de A.compareTo (B).

Para ==,! =:

Si A o B es BigDecimal, obligue a A y B a BigDecimal y luego:

  • Si el operador es ==, devuelve A.equals (B)
  • Si el operador es! =, Regrese! A.equals (B)

Esto significa que los operadores == y != .equals() resultado una llamada al método .equals() , que compara no solo los valores, sino también la escala de los BigDecimals. Los otros operadores de comparación dan como resultado una llamada al método .compareTo() , que compara solo los valores.

Por supuesto, lo siguiente funcionaría:

<c:if test="${not ((someBigDecimal < 0) or (someBigDecimal > 0))}">

Pero esto es bastante feo, ¿hay una mejor manera de hacerlo?


En JSP 2.2 EL y por encima de esta expresión se evaluará como true :

${someBigDecimal.unscaledValue() == 0}

Esto evitará cualquier pérdida de precisión, pero supone que someBigDecimal es siempre de tipo BigDecimal .

Una función EL personalizada es probablemente el mejor enfoque para versiones anteriores de EL:

${fn:isZero(someBigDecimal)}

El núcleo del problema es que este código de Java se evalúa como false porque ZERO tiene una scale de 0 y el nuevo BigDecimal tiene una escala distinta de cero:

BigDecimal.ZERO.setScale(3).equals(BigDecimal.ZERO)


Puedes probar la función signum:

<c:if test="#{someBigDecimal.signum() == 0}">


<c:if test="${someBigDecimal eq 0}">


<c:if test="${someBigDecimal.compareTo(BigDecimal.ZERO) == 0}">