如何在Java中以0.1f的增量在0.1f和1.0f之间进行迭代?
可能重复:
Java浮动和双打,如何避免0.0 + 0.1 + … + 0.1 == 0.9000001?
我在Java中遇到以下问题 – 我需要以0.1f为增量在0.1f和1.0f之间迭代,所以我希望我的输出看起来像这样:
0.1 0.2 0.3 0.4 ... 0.9
相反,当我这样做时:
for(float i = 0.1f; i < 1f; i += 0.1f) System.out.println(i);
我明白了
0.1 0.2 0.3 0.4 0.5 0.6 0.70000005 0.8000001 0.9000001
我想它与计算机表示分数的方式有关,但我想知道为什么会这样,如果有什么我可以做的就是阻止它。 谢谢。
在for循环中使用整数以避免重复的浮点数学运算,这会使浮点错误复杂化。
for (int i = 1; i < 10; i++) { float f = (float) i / 10.0f; System.err.println(f); }
你可以试试这个:
for(int i = 1; i < 10; i++) System.out.println(i/10f);
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
您所看到的是浮动所固有的不准确的产物,如果您连续添加它们,就会自然地积累,就像您在发布的代码中所做的那样。 如果我们在循环中使用int
,我们避免浮点加法,因此也避免了错误的建立。
浮点数是二进制的,并不能很好地表示小数
如果适用,则以1/8或0.125进行迭代。
for(float i =1.0f;i<10f;i+=1f) System.out.println(i/10f);`
很丑,但在这里工作(Ubuntu AMD64 OpenJDK)