我花了差不多整天试图弄清楚为什么会发生这种情况,如果它不是一个整数,我的代码会增加一个浮点数直到它是一个整数,我会通过将值递增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?我不认为这可能与数据类型有任何关系,因为我正在向浮点数添加浮点数。
答案 0 :(得分:5)
Java的浮点数遵循IEEE floating point standards,这意味着0.01之类的值无法完美表示(它是二进制的重复小数)。只显示0.01时会出现一个小错误(转换为String
时它会被舍入),但每次添加(或任何其他数学运算)时都会累积错误;你已经显示了可见的效果。
您可以使用精度为两倍的double
来减少浮点错误,但这也最终会显示浮点错误。您还可以使用BigDecimal
,它支持任意精度。
答案 1 :(得分:0)
是的,这是IEEE specification浮点的问题。如果精度在您的应用程序中很重要,则应使用BigDecimal