【问题标题】:DecimalFormat: wrong digit after commaDecimalFormat:逗号后的数字错误
【发布时间】:2014-09-12 11:48:37
【问题描述】:

我遇到了 DecimalFormat 的问题。在我的代码中,我有:

Double value = 1.40;
DecimalFormat df = new DecimalFormat("###,###,###.00########");
df.setGroupingUsed(true);
df.setDecimalSeparatorAlwaysShown(true);
System.out.println(df.format(value));

现在,有了这段代码,理论上,我应该:

1.40

但是,当值被格式化时,我有这样的输出:

1.3999999762

为什么会这样?我该如何解决?感谢您的回答!

【问题讨论】:

  • 看看这个:ideone.com/SiUO90
  • 好的,我无法重现这个。你不告诉我们什么?这段代码正是您正在运行的代码吗?
  • 你确定第一行没有写Double value = 1.40F;
  • 我解决了,谢谢帮助!
  • 如果您解决了,那么您应该在此处发布您的解决方案,以供未来遇到类似问题的用户使用。

标签: java format decimal decimalformat


【解决方案1】:

这不是DecimalFormat的问题,是the way binary float point numbers work的问题。某些数字无法以这种方式表示,因此您可以得到它们的近似值 - 就像您的情况一样。

使用BigDecimal 是一种可能的解决方案。

【讨论】:

  • 它的意义远不止这些。有许多double 值比1.3999999762 更接近1.40
  • @DavidWallace 1.3999999762 是四舍五入到第 10 位的正确数字
  • 不,不是。双打精确到比这更高的有效数字。如果这是一个浮点数而不是双精度数,这将是正确的。
  • @DavidPostill 哦,谢谢,没看到是德语文章。固定
  • @DavidWallace 你是对的,它是浮点数的正确数字。谢谢
【解决方案2】:

您应该避免直接使用DecimalFormat。你可以这样尝试:

NumberFormat f = NumberFormat.getInstance(Locale.GERMANY);
if (f instanceof DecimalFormat) {
    ((DecimalFormat) f).applyPattern("###,###,###.00########");
}

IDEONE

使用BigDecimal 是不错的选择。

Oracle 文档说:

获取特定语言环境的 NumberFormat,包括默认值 locale,调用 NumberFormat 的工厂方法之一,例如 获取实例()。通常,不要调用 DecimalFormat 直接构造函数,因为 NumberFormat 工厂方法可能 返回 DecimalFormat 以外的子类。

【讨论】:

    猜你喜欢
    • 2017-09-30
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多