【问题标题】:Jstl negative zeroJstl 负零
【发布时间】:2012-08-24 11:04:21
【问题描述】:

如果你尝试以下一点,你会得到 -0

<c:set var="demo" value="-0.04" />
<fmt:formatNumber maxFractionDigits="1" value="${demo}" var="demo" />

但如果你测试它是否小于 0 则为真

<c:if test="${demo < 0.00}">...</c:if>

我该如何解决这个问题?这似乎没有意义,0 等于 -0,我已经用代数证明了它......在this post 他们指向 IEEE 参考,但我仍然无法解决问题

编辑:感谢您的评论,代码示例中存在错误。我将四舍五入的值分配给演示变量。而且输出不是0,而是-0,我试过了

【问题讨论】:

  • 有什么问题?您已为变量分配了值-0.04,然后将其输出,四舍五入到小数点后一位(将输出 0.0)。然后您测试原始值 -0.04 是否小于 0.00... 这会产生 true。
  • 代码有错误,已修复。它不输出0,输出-0
  • 乐队名称为“负零”的 Dibs!
  • @ZeroPage negativezero.org
  • @DaveNewton awwww... :-)

标签: java jstl


【解决方案1】:

这里远射,但是是因为它把原来的 -0.04 解析为字符串吗?

也许试试这个,我认为这会迫使它评估为一个数字:

<c:set var="demo" value="${-0.04}" />

【讨论】:

  • 感谢您的回复。没有区别,它仍然产生 -0
【解决方案2】:

好的,这次我想我可以解释一下了:这是java.text.DecimalFormat 的一个错误(或功能),这是&lt;fmt:formatNumber /&gt; 在引擎盖下使用的。

这是我作为实验尝试的快速 Beanshell 会话的复制粘贴:

BeanShell 2.0b4 - by Pat Niemeyer (pat@pat.net)
bsh % import java.text.*;
bsh % fmt = new DecimalFormat();
bsh % fmt.setMaximumFractionDigits(1);
bsh % print(fmt.format(-0.04d));
-0
bsh % 

【讨论】:

    【解决方案3】:

    您可以编写自己的数字格式标记来弥补这一点。

    // Read these values from tag attributes
    String pattern = "0";
    Double myNumber = -0.04d;
    
    // Create a decimal format with correct rounding
    DecimalFormat df = new DecimalFormat(pattern);
    df.setRoundingMode(RoundingMode.HALF_UP);
    
    // Format in two steps to compensate for '-0'
    String temp = df.format(myNumber + 1);
    String formatted = df.format(Double.valueOf(temp) - 1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-09
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2012-07-05
      • 2011-05-04
      • 2016-08-25
      相关资源
      最近更新 更多