【问题标题】:DecimalFormat not rounding correctly for specific case对于特定情况,DecimalFormat 未正确舍入
【发布时间】:2018-06-25 12:04:51
【问题描述】:

我在编码中遇到了一个相当不寻常的场景。我开发了这个应用程序,它已经使用了 6 个月,没有出现任何错误。

为了简化我的问题。我正在使用 decimalFormat 来对数字进行四舍五入,并确保它们保留到小数点后 2 位,并且效果很好。

但是,出现了一个问题,它被发回给我,据说除了这个特定的情况外,其他所有情况都有效,而且似乎特别是数字 4?

案例:

总计 = 44.75 平均值 = 4.475 MBW(2 个小数位)= 4.47 不是 4.48

这让我想知道 DecimalFormat 在四舍五入时是否总是正确的?奇怪的是,当它是 1.475 时,它会四舍五入到 0.48,除了 4 之外的所有数字??

有人有什么想法吗?

Java 示例:

 final DecimalFormat df = new DecimalFormat("#0.00");
 weight2 = 4.475
 MBW = df.format(weight2);

上面的结果仍然是 4.47.. 任何正常的四舍五入都应该是 4.48? 这适用于任何其他整数,例如 1.475 是 1.48,2.275 是 2.48...为什么整数 4 不起作用???

【问题讨论】:

  • 是的,请发布代码。我很难相信 1.475 有效,但 4.475 无效。
  • @jingx 我已经添加了大部分课程,因为我不确定你需要什么......这可能很难理解,但基本上有类似的输入,然后总计是 calc,然后是平均值,然后是平均值应四舍五入到小数点后 2 位并适当四舍五入。我希望你能看到我看不到的东西!
  • 你能把它减少到一行代码,比如df.format(4.475)会输出4.47,但df.format(1.475)会输出1.48?不是想给您带来麻烦,但它是故障排除和发布寻求帮助的有效方法,因为如果在您的还原过程中行为丢失,则问题不在DecimalFormat
  • 问题似乎是整数4这很奇怪@jingx
  • @Henry 我看不出这是怎么重复的???

标签: java android rounding decimalformat


【解决方案1】:

这些数字不能完全表示为双精度数。查看以双精度表示的数字的位模式:

1.475 -> 3ff799999999999a
4.475 -> 4011e66666666666

你看到第一个比精确值略大,而另一个比精确值略小。所以它被四舍五入到 4.47。

你也可以试试下面的实验:

System.out.println(1.475 - 1);
System.out.println(4.475 - 4);
System.out.println(5.475 - 5);

结果是

0.4750000000000001
0.47499999999999964
0.47499999999999964

【讨论】:

  • 那么我怎样才能确保它确实四舍五入到 4.48?还是这是一个漏洞
  • 你不能。这就是浮点运算的工作原理。阅读重复问题中链接的材料以获得一些见解。
  • 啊对..为什么它只是数字4呢?这是位模式大于数字的唯一情况
  • 不,同样的情况发生在 5.475、6.475 和许多其他数字上。
  • 我可以确认这不是因为我得到所有其他结果的 0.48 并且已经彻底测试了每一个结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多