1
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 磅符号,它似乎仍然会打印出整个数字。

谢谢

4

1 回答 1

4

解释

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

事实上,这些值是:

12323233.445 -> 12323233.445000000298
12323233.415 -> 12323233.4149999991059

舍入必须与之配合,因此它将第一个值向上舍入,第二个值向下舍入。

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

浮点数是根据 IEE 754 实现的,这准确地指定了它们在内部的工作方式。


表示

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

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

于 2020-12-02T17:42:24.867 回答