测试JSP EL表达式中BigDecimal值是否为零

时间:2012-01-06 22:54:03

标签: java jsp el bigdecimal

以下并不总是像您期望的那样:

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

如果someBigDecimal的值为0,但其标度不是0,则==操作返回false。也就是说,当someBigDecimal是new BigDecimal(“0”)时它返回true,但是当someBigDecimal是new BigDecimal(“0.00”)时返回false。

这是JSP 2.0,2.1和2.2规范的结果,它们声明:

对于&lt ;,&gt;,&lt; =,&gt; =:

  

如果A或B是BigDecimal,则将A和B强制转换为BigDecimal和   使用A.compareTo(B)的返回值。

对于==,!=:

  

如果A或B是BigDecimal,则将A和B强制转换为BigDecimal,然后:

     
      
  • 如果operator = =,则返回A.equals(B)
  •   
  • 如果操作符是!=,则返回!A.equals(B)
  •   

这意味着==!=运算符会调用.equals()方法,该方法不仅会比较值,还会比较BigDecimals的比例。其他比较运算符导致调用.compareTo()方法,该方法仅比较值。

当然,以下内容可行:

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

但这很难看,有更好的方法吗?

5 个答案:

答案 0 :(得分:10)

在JSP 2.2 EL及以上版本中,此表达式将评估为true

${someBigDecimal.unscaledValue() == 0}

这样可以避免任何精度损失,但假设someBigDecimal始终为BigDecimal类型。

custom EL function可能是旧版EL的最佳方法:

${fn:isZero(someBigDecimal)}

问题的核心是此Java代码的评估结果为false,因为ZERO的{​​{3}} 0和新的BigDecimal具有非零刻度:

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

使用最新版本的EL(例如Tomcat 7支持),您可以尝试:

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

您可以尝试使用signum功能:

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