舍入错误为double?

时间:2014-09-28 03:30:27

标签: java floating-point double floating-point-precision

当我运行以下代码时:

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:我认为有些人误解了我的问题。我问为什么这种情况发生,如何避免遇到这些错误。

2 个答案:

答案 0 :(得分:0)

无法避免浮点算术错误。表示数字时使用的位数总是有限的。您所能做的就是使用具有更高精度(位)的数据类型  java.math.BigDecimal。阅读John Zukowski的The need for BigDecimal了解更多信息。 试试这个::

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);

答案 1 :(得分:0)

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