以下代码的行为并不总是如你所预期:
<c:if test="${someBigDecimal == 0}">
如果一个BigDecimal的值为0,但小数位数不为0,则“==”操作会返回false。也就是说,当someBigDecimal是new BigDecimal("0")时,它将返回true,但当someBigDecimal是new 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,然后:
- 如果运算符是==,则返回A.equals(B)。 - 如果运算符是!=,则返回!A.equals(B)。
这意味着“==”和“!=”操作符会调用“equals()”方法,该方法比较BigDecimal的值和小数位数。其他比较运算符会调用“compareTo()”方法,该方法仅比较值。
当然,以下代码也可以工作:
<c:if test="${not ((someBigDecimal < 0) or (someBigDecimal > 0))}">
但这样做相当丑陋,有没有更好的方法?
== 0.0
会发生什么? - Dave Newton