为什么decimalformat循环不一致?

bybem2ql  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(271)

这个问题在这里已经有答案了

浮点数学坏了吗((31个答案)
上个月关门了。

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; 总共是0.42。为什么?在数字前面的#是否与我有多少个数字有关,因为它似乎仍然打印出整个数字,即使我只有1磅符号。
谢谢

67up9zun

67up9zun1#

解释

由于浮点精度有限 double 价值观并不是你想要的。
实际上,这些值是:

12323233.445 -> 12323233.445000000298
12323233.415 -> 12323233.4149999991059

舍入必须与此一起工作,因此它向上舍入第一个值,向下舍入第二个值。
请注意,你的观察是不正确的,它是完全相反的。您声称第一个值将向下舍入,而第二个值将向上舍入。但执行它会产生相反的行为。而这种行为正是由于上述原因而得到解释的。
浮点数是根据iee754实现的,它精确地指定了它们在内部的工作方式。

代表

现在,问题是这些数字无法表示。规范说,它应该使用最接近的数字来代替。这正是这里发生的事情。
您可以在这里进一步检查和使用它:
https://float.exposed/0x416781342e3d70a4
https://float.exposed/0x416781342d47ae14

相关问题