Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试JSP EL表达式中的BigDecimal值是否为零_Java_Jsp_El_Bigdecimal - Fatal编程技术网

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}">