以下行为并不总是如您所愿:
<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 规范的结果,其中声明:
对于<、>、<=、>=:
If A or B is BigDecimal, coerce both A and B to BigDecimal and use the return value of A.compareTo(B).
对于 ==, !=:
If A or B is BigDecimal, coerce both A and B to BigDecimal and then:
- If operator is ==, return A.equals(B)
- If operator is !=, return !A.equals(B)
这意味着 ==
和 !=
运算符会调用 .equals()
方法,该方法不仅比较值,还有 BigDecimals 的比例。其他比较运算符导致调用 .compareTo()
方法,该方法仅比较值。
当然,下面的方法是可行的:
<c:if test="${not ((someBigDecimal < 0) or (someBigDecimal > 0))}">
但这很丑陋,有没有更好的方法来做到这一点?
最佳答案
在 JSP 2.2 EL 及更高版本中,此表达式的计算结果为 true
:
${someBigDecimal.unscaledValue() == 0}
这将避免任何精度损失,但假设 someBigDecimal
始终是 BigDecimal
类型。
A custom EL function可能是旧版本 EL 的最佳方法:
${fn:isZero(someBigDecimal)}
问题的核心是此 Java 代码的计算结果为 false
,因为 ZERO
有一个 scale 0
和新的 BigDecimal
具有非零标度:
BigDecimal.ZERO.setScale(3).equals(BigDecimal.ZERO)
关于java - 测试 JSP EL 表达式中的 BigDecimal 值是否为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8765555/