Java 测试JSP EL表达式中的BigDecimal值是否为零
以下情况并不总是像您预期的那样:Java 测试JSP EL表达式中的BigDecimal值是否为零,java,jsp,el,bigdecimal,Java,Jsp,El,Bigdecimal,以下情况并不总是像您预期的那样: <c:if test="${someBigDecimal == 0}"> 但是这很难看,有没有更好的方法呢?对于最新版本的EL(例如Tomcat 7支持),您可以尝试: <c:if test="${someBigDecimal.doubleValue() == 0}"> 在JSP 2.2 EL及以上版本中,此表达式的计算结果将为true: ${someBigDecimal.unscaledValue() == 0} 这将避免任何精
<c:if test="${someBigDecimal == 0}">
但是这很难看,有没有更好的方法呢?对于最新版本的EL(例如Tomcat 7支持),您可以尝试:
<c:if test="${someBigDecimal.doubleValue() == 0}">
在JSP 2.2 EL及以上版本中,此表达式的计算结果将为
true
:
${someBigDecimal.unscaledValue() == 0}
这将避免任何精度损失,但假定someBigDecimal
始终为BigDecimal
类型
A可能是旧版本EL的最佳方法:
${fn:isZero(someBigDecimal)}
问题的核心是,此Java代码的计算结果为
false
,因为ZERO
的值为0
,而新的BigDecimal
的值为非零:
您可以尝试signum功能:
<c:if test="#{someBigDecimal.signum() == 0}">
如果使用==0.0
,会发生什么情况?@Dave Newton-我尝试了使用Tomcat 6进行测试,文字0.0被强制转换为一个BigDecimal,值为0,刻度为0,因此没有任何区别。即使它的刻度为1,JSP规范也只说该值应强制为BigDecimal,但没有提到刻度,因此行为是不可预测的。@Dave Newton-我可能在不可预测的部分上说错了。根据JSP2.2规范的第1.18.3节,将使用接受“double”的BigDecimal构造函数将0.0强制为BigDecimal。这意味着,无论小数点后有多少个零,生成的BigDecimal将始终具有0的刻度。谢谢您的回答。目前,我们仍在使用JSP2.1。我们曾考虑过一个自定义函数,但我希望避免它。不过,我现在同意这是最好的方法。我认为如果我们使用JSP 2.2规范,这将是最好的方法。我的问题仅限于比较BigDecimal和literal zero,但这也适用于比较两个BigDecimal值。你是说eq
的行为不同于=
?因为我的理解是,eq
只是=
的别名。是的,它们是不同的。就像java中'equal()'和'='之间的关系一样。对不起,但是eq
只是=
的别名eq
表示方法equals()
。是equals()
和=
之间的区别。您的链接是针对Java的,但这是JSP EL表达式语言,其中eq
与=
相同。如果阅读该问题,您将看到==
导致调用.equals()
。事实上,这就是问题的关键所在。
${fn:isZero(someBigDecimal)}
BigDecimal.ZERO.setScale(3).equals(BigDecimal.ZERO)
<c:if test="${someBigDecimal eq 0}">
<c:if test="#{someBigDecimal.signum() == 0}">