下面的行为并不总是像您所期望的那样:
<c:if test="${someBigDecimal == 0}">如果someBigDecimal的值为0,但其标度不是0,则==操作将返回false。也就是说,当someBigDecimal是新的BigDecimal("0")时,它返回true,而当someBigDecimal是新的BigDecimal("0.00")时,返回false。
这是JSP 2.0、2.1和2.2规范的结果,这些规范声明:
对于<,>,<=,>=:
如果A或B是BigDecimal,则强制A和B同时使用BigDecimal并使用A.compareTo(B)的返回值。
对于==,!=:
如果A或B是BigDecimal,则将A和B都胁迫到BigDecimal,然后:
这意味着==和!=运算符将导致对.equals()方法的调用,该方法不仅比较值,而且还比较BigDecimals的规模。其他比较运算符将导致对.compareTo()方法的调用,该方法只比较值。
当然,以下几点是可行的:
<c:if test="${not ((someBigDecimal < 0) or (someBigDecimal > 0))}">但这是相当丑陋的,有更好的方法来做到这一点吗?
发布于 2012-01-07 11:17:02
在JSP2.2EL及以上版本中,这个表达式将计算为true
${someBigDecimal.unscaledValue() == 0}这将避免任何精度损失,但假设someBigDecimal始终是BigDecimal类型。
对于较早版本的EL,custom EL function可能是最好的方法:
${fn:isZero(someBigDecimal)}问题的核心是,这个Java代码的计算结果为false,因为ZERO有一个 of 0,而新的BigDecimal具有非零标度:
BigDecimal.ZERO.setScale(3).equals(BigDecimal.ZERO)发布于 2012-01-07 10:53:06
<c:if test="${someBigDecimal.compareTo(BigDecimal.ZERO) == 0}">发布于 2012-01-07 08:52:07
使用最新版本的EL (例如Tomcat 7所支持的),您可以尝试:
<c:if test="${someBigDecimal.doubleValue() == 0}">https://stackoverflow.com/questions/8765555
复制相似问题