java - 对于特定情况,DecimalFormat 未正确舍入

标签 java android rounding decimalformat

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

为了简化我的问题..我使用decimalFormat对数字进行四舍五入并确保它们精确到小数点后两位,并且这一直工作得很好。

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

案例:

Total = 44.75 Mean = 4.475 MBW (2 decimal places) = 4.47 NOT 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 不起作用???

最佳答案

这些数字不能精确地表示为 double 。查看表示为 double 的数字的位模式:

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

关于java - 对于特定情况,DecimalFormat 未正确舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48287036/

相关文章:

android - 如何创建 HUD(镜像)布局/屏幕 Android?

c - 简化舍入代码 C

java - 从 Kotlin 调用 Java 编写的抛出异常的方法时,如何实现空安全?

java - 如何使用java SDK更新GCP实例对象?

java - 不是 "join"中断线程可以吗?

java - 使用 Android 日历获取当前时间

javascript - 文本框圆 Angular asp.net

python--表达式的舍入值--意外的 EOF

java - 为 Android 绘图应用程序创建橡皮擦

java - 如何在 Java 中的 try catch 中获取异常?