当我运行以下代码时:
double x = 4.35;
double y = x * 100;
System.out.println(y);
我得到434.99999999999994
由于浮点精度的性质,这是预期的。但是当我运行时:
double x = 4.35;
double y = x * 1000;
System.out.println(y);
我得到4350.0
在控制台中。同样,当我替换 1000
时与 10
,我得到43.5
,这很奇怪,因为这些数字没有舍入误差。当我将双倍乘以 10 to the power of the number of decimal places
时,似乎只有舍入误差。为什么会这样?
此外,当我尝试使用 4.25
运行这三个代码块时作为我的值 x
,我得到了一个不错的425.0
在控制台中。舍入误差是否仅适用于某些小数值?
编辑: 将 4.35 除以 10 也得到了一个古怪的小数(准确地说是 0.43499999999999994
)。另外,如果我将 x 设置为 43.5,则根本不会出现舍入错误。乘以 10 得到 435.0。
编辑2:我认为有些人误解了我的问题。我问的是为什么会发生这种情况,而不是如何避免遇到这些错误。
最佳答案
不产生任何舍入误差的计算是那些可以在二进制系统中精确表示的计算。这包括所有整数,例如 0.5 个十进制,即 0.1 个二进制,或 0.25 个十进制,即 0.01 个二进制。因此,您发布的示例没有舍入误差。然而,小数 0.35 不能用有限多个二进制数字表示。
关于java - double 舍入误差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26081326/