【发布时间】:2012-02-04 15:18:58
【问题描述】:
以下行为并不总是如您所愿:
<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 规范,其中规定:
对于 、=:
如果 A 或 B 是 BigDecimal,则将 A 和 B 都强制为 BigDecimal 并且 使用 A.compareTo(B) 的返回值。
对于 ==, !=:
如果 A 或 B 是 BigDecimal,则强制 A 和 B 都为 BigDecimal,然后:
- 如果运算符为 ==,则返回 A.equals(B)
- 如果运算符是 !=,则返回 !A.equals(B)
这意味着== 和!= 运算符会调用.equals() 方法,该方法不仅比较值,还比较BigDecimals 的小数位数。其他比较运算符导致调用 .compareTo() 方法,该方法仅比较值。
当然,以下是可行的:
<c:if test="${not ((someBigDecimal < 0) or (someBigDecimal > 0))}">
但这很丑陋,有没有更好的方法来做到这一点?
【问题讨论】:
-
如果你使用
== 0.0会发生什么? -
@Dave Newton - 我尝试使用 Tomcat 6 进行测试,文字 0.0 被强制转换为值为 0 且比例为 0 的 BigDecimal,因此没有区别。即使它确实有 1 的比例,JSP 规范也只说该值应该被强制为 BigDecimal,但没有提到比例,所以行为将是不可预测的。
-
@Dave Newton - 我可能误会了不可预测的部分。根据 JSP 2.2 规范的第 1.18.3 节,0.0 将被强制为 BigDecimal 使用采用“双”的 BigDecimal 构造函数。这意味着无论小数点后有多少个零,生成的 BigDecimal 的比例始终为 0。
标签: java jsp el bigdecimal