为什么 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 实现的,这具体说明了它们的内部工作方式。
代表
现在,问题是这些数字无法表示。规范说它应该使用可以表示的最接近的数字。这正是这里正在发生的事情。
您可以进一步检查并在此处试用它:
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 实现的,这具体说明了它们的内部工作方式。
代表
现在,问题是这些数字无法表示。规范说它应该使用可以表示的最接近的数字。这正是这里正在发生的事情。
您可以进一步检查并在此处试用它: