-1

我花了几乎一整天的时间试图弄清楚为什么会这样不断将它增加 0.01 直到它是一个整数,但它永远不会停止,调试它我注意到随着循环的进行,这个数字变得越来越不准确,导致它到最后变成 0.0000066。
我想也许该变量可能已经在其他地方以某种方式被访问过,所以我只是在一个空的“主”程序中创建了它:

float value = 0;
for (int i=0; i<100; i++) {
    value += 0.01f;
}
System.out.println(value); // Displays 0.99999934
System.out.println(value == 1); // Just in case it's displaying wrong in println (displays false)

为什么到最后不是1?我认为这与数据类型无关,因为我正在向浮点数添加浮点数。

4

2 回答 2

5

Java 的浮点数遵循IEEE 浮点标准,这意味着无法完美表示诸如 0.01 之类的值(它是二进制的重复十进制)。仅显示 0.01 时会出现一个不可见的小错误(转换为 a 时会四舍五入String),但错误会在每次添加(或任何其他数学运算)时累积;你已经显示了可见的效果。

您可以使用double两倍的精度来减少浮点错误,但这最终也会显示浮点错误。您也可以使用BigDecimal,它支持任意精度。

于 2013-07-25T20:49:04.653 回答
0

是的,这是IEEE浮点规范的问题。如果精度在您的应用程序中很重要,您应该改用BigDecimal

于 2013-07-25T20:50:32.210 回答