为什么 DecimalFormat 舍入不一致?

Why does DecimalFormat round inconsistently?

import java.text.*;

public class TryStuffOut {
    public static void main(String[] args) {
       double n=12323233.445;
       DecimalFormat x = new DecimalFormat("#.##");
       System.out.println(x.format(n));
    }
}

为什么将小数部分向下舍入为 .44,当我将变量 n 切换为 double n=12323233.415; 时,它向上舍入为 .42。为什么? 并且 deicmal 前面的 # 是否与我有多少位数字有关,因为即使我只有 1 磅符号,它似乎仍然打印出整个数字。

谢谢

说明

由于浮点精度有限,您的 double 值实际上并不是您想要的值。

实际上,值是:

12323233.445 -> 12323233.445000000298
12323233.415 -> 12323233.4149999991059

四舍五入必须与它一起工作,因此它将第一个值 up 和第二个值 down.[=14= 舍入]

注意你的观察是不正确的,恰恰相反。您声称第一个值会向下舍入,而第二个值会向上舍入。但是执行它会产生相反的行为。由于上述原因,该行为得到了解释。

浮点数是根据 IEE 754 实现的,这具体说明了它们的内部工作方式。


代表

现在,问题是这些数字无法表示。规范说它应该使用可以表示的最接近的数字。这正是这里正在发生的事情。

您可以进一步检查并在此处试用它: