我几乎花了一整天的时间试图弄清楚为什么会发生这种情况,我有一个代码,如果它不是整数,直到它是整数,我会通过将值增加0.01来触发它,循环不断将它增加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?我不认为这与数据类型有任何关系,因为我正在向浮点添加一个浮点。
Java的浮点数字遵循IEEE浮点标准,这意味着像0.01这样的值不能完美地表示(它是二进制中的重复小数)。有一个小错误,当仅显示0.01时是不可见的(当转换为String
时会四舍五入),但错误会在每次加法(或任何其他数学运算)时累积;您已经显示了可见的效果。
您可以使用精度为两倍的double
来减少浮点误差,但这也将最终显示浮点误差。您也可以使用BigDecimal
,它支持任意精度。
是的,这是IEEE浮点规范的问题。如果精度在应用程序中很重要,则应使用BigDecimal