以下并不总是像您期望的那样:
<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))}">
但这很难看,有更好的方法吗?
答案 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}">