java - 测试 JSP EL 表达式中的 BigDecimal 值是否为零

标签 java jsp el bigdecimal

以下行为并不总是如您所愿:

<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 规范的结果,其中声明:

对于<、>、<=、>=:

If A or B is BigDecimal, coerce both A and B to BigDecimal and use the return value of A.compareTo(B).

对于 ==, !=:

If A or B is BigDecimal, coerce both A and B to BigDecimal and then:

  • If operator is ==, return A.equals(B)
  • If operator is !=, return !A.equals(B)

这意味着 ==!= 运算符会调用 .equals() 方法,该方法不仅比较值,还有 BigDecimals 的比例。其他比较运算符导致调用 .compareTo() 方法,该方法仅比较值。

当然,下面的方法是可行的:

<c:if test="${not ((someBigDecimal < 0) or (someBigDecimal > 0))}">

但这很丑陋,有没有更好的方法来做到这一点?

最佳答案

在 JSP 2.2 EL 及更高版本中,此表达式的计算结果为 true:

${someBigDecimal.unscaledValue() == 0}

这将避免任何精度损失,但假设 someBigDecimal 始终是 BigDecimal 类型。

A custom EL function可能是旧版本 EL 的最佳方法:

${fn:isZero(someBigDecimal)}

问题的核心是此 Java 代码的计算结果为 false,因为 ZERO 有一个 scale 0 和新的 BigDecimal 具有非零标度:

BigDecimal.ZERO.setScale(3).equals(BigDecimal.ZERO)

关于java - 测试 JSP EL 表达式中的 BigDecimal 值是否为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8765555/

相关文章:

主线程没有调用堆栈的 Java 线程转储? (jsvc)

java - 如何在给定时间(或间隔)后刷新 jsp 页面?

java - eclipse EE juno : java.net.bind 异常

java - 如何在 Spring 更新时显示 &lt;input&gt; 文本字段中的属性值?

jsf - 使用 <c :set> inside Facelets <ui:repeat> tags 的 EL 变量

java - 无法打印 oracle.sql.ARRAY 的值

java - 如何忽略Web服务中的空参数?

Java递归理解

java - 当我从 Glassfish 3 升级到 4 时,为什么我的 JSP 中会出现 NullPointerExceptions?

jsp - 在 EL 中只打印类名