首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试JSP表达式中的BigDecimal值是否为零

测试JSP表达式中的BigDecimal值是否为零
EN

Stack Overflow用户
提问于 2012-01-06 22:54:02
回答 5查看 22.6K关注 0票数 19

下面的行为并不总是像您所期望的那样:

代码语言:javascript
复制
<c:if test="${someBigDecimal == 0}">

如果someBigDecimal的值为0,但其标度不是0,则==操作将返回false。也就是说,当someBigDecimal是新的BigDecimal("0")时,它返回true,而当someBigDecimal是新的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()方法的调用,该方法只比较值。

当然,以下几点是可行的:

代码语言:javascript
复制
<c:if test="${not ((someBigDecimal < 0) or (someBigDecimal > 0))}">

但这是相当丑陋的,有更好的方法来做到这一点吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-07 11:17:02

在JSP2.2EL及以上版本中,这个表达式将计算为true

代码语言:javascript
复制
${someBigDecimal.unscaledValue() == 0}

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

对于较早版本的EL,custom EL function可能是最好的方法:

代码语言:javascript
复制
${fn:isZero(someBigDecimal)}

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

代码语言:javascript
复制
BigDecimal.ZERO.setScale(3).equals(BigDecimal.ZERO)
票数 13
EN

Stack Overflow用户

发布于 2012-01-07 10:53:06

代码语言:javascript
复制
<c:if test="${someBigDecimal.compareTo(BigDecimal.ZERO) == 0}">
票数 4
EN

Stack Overflow用户

发布于 2012-01-07 08:52:07

使用最新版本的EL (例如Tomcat 7所支持的),您可以尝试:

代码语言:javascript
复制
<c:if test="${someBigDecimal.doubleValue() == 0}">
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8765555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档