Java 双精度的舍入误差?

Java 双精度的舍入误差?,java,floating-point,double,floating-point-precision,Java,Floating Point,Double,Floating Point Precision,当我运行以下代码时: double x = 4.35; double y = x * 100; System.out.println(y); 我得到了434.99999999994 4,这是由于浮点精度的性质所期望的。然而,当我跑步时: double x = 4.35; double y = x * 1000; System.out.println(y); 我在控制台中获得4350.0。类似地,当我用10替换1000时,我得到了43.5,这是很特别的,因为这些数字没有舍入误差。当我将doub

当我运行以下代码时:

double x = 4.35;
double y = x * 100;
System.out.println(y);
我得到了
434.99999999994 4
,这是由于浮点精度的性质所期望的。然而,当我跑步时:

double x = 4.35;
double y = x * 1000;
System.out.println(y);
我在控制台中获得
4350.0
。类似地,当我用
10
替换
1000
时,我得到了
43.5
,这是很特别的,因为这些数字没有舍入误差。当我将double by
10乘以小数位数的幂时,似乎只有舍入误差。为什么会这样

另外,当我尝试使用
4.25
作为
x
的值来运行三个代码块时,我在控制台中得到了一个不错的
425.0
。舍入误差是否仅适用于某些十进制值

EDIT:4.35除以10也得到了一个古怪的小数(
0.434999999994
)。另外,如果我将x设置为43.5,则根本没有舍入错误。乘以10得到435.0


编辑2:我想有些人误解了我的问题。我在问为什么会发生这种情况,而不是如何避免出现这些错误。

没有办法避免浮点算术错误。用于表示数字的位数总是有限的。您所能做的就是使用精度更高(位)的数据类型,如 . 更多信息,请阅读John Zukowski的文章。 试试这个:

import java.math.BigDecimal;

double x = 4.35;
BigDecimal bd1 = BigDecimal.valueOf(x);
BigDecimal bd2= BigDecimal.valueOf(100);
BigDecimal multiply = bd1.multiply(bd2);
System.out.println(multiply);

不产生任何舍入误差的计算是那些可以在二进制中精确表示的计算。包括所有整数,例如,0.5十进制为0.1二进制或0.25十进制为0.01二进制。因此,您发布的示例没有舍入错误。但是,0.35十进制不能用有限多的二进制数字表示。

有趣的是,当我使用
浮点时,我得到的是435.0。原因在于计算是在您使用的特定CPU中实现的。正如您所说,关于为什么会发生这种情况,而不是如何避免这种情况,以及为什么某些值恰好是数学结果的原因,前面的一个问题是@JimGarrison,该文档仅在对答案“天哪,这非常复杂,我最好将浮点错误视为随机”感到满意时才直接回答这个问题,只要你记得自己在做抽象,这是很好的。如果一个不太容易满足,那么您链接到的文档只回答了这个问题,与Java语言定义回答StackOverflow上大多数Java问题的意义相同。您可以使用BigDecimal查看确切的值,这将解释某些值按预期舍入的方式,有些值应为一个小错误。4.35不是用binary.True精确表示的。在答案中添加了这一点。