如何在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)