为什么DecimalFormat的舍入不一致


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。为什么?并且指示前面的#与我有多少数字有关,因为即使我只有1磅符号,它似乎仍然打印出整个数字。

感谢

说明

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

事实上,这些值是:

12323233.445 -> 12323233.445000000298
12323233.415 -> 12323233.4149999991059

四舍五入必须与此配合使用,因此它将第一个值向上四舍五舍五入,将第二个值向下四舍五进。

请注意,你的观察是不正确的,恰恰相反。您声称第一个值将向下取整,而第二个值将向上取整。但执行它会产生相反的行为。这种行为是由于上述原因而解释的。

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


表示

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

你可以在这里进一步检查并使用它:

  • https://float.exposed/0x416781342e3d70a4
  • https://float.exposed/0x416781342d47ae14

最新更新