java中1和1.0_在Java中如何以0.1f增量在0.1f和1.0f之间进行迭代?
本問題已經有最佳答案,請猛點這里訪問。
Possible Duplicate:
Java floats and doubles, how to avoid that 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
我想這與計算機表示分數的方式有關,但是我想知道為什么會這樣,以及是否有什么辦法可以阻止它。
謝謝。
您可以改用雙打嗎?
確實,這根本不可行。 沒有確切的值0.1可表示為浮點數或雙精度數。
"我想知道這是為什么"-簡短的答案是"舍入誤差"。 要獲得較長的答案,請閱讀以下內容-docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html。" ...如果有什么我可以阻止的事情"-簡短回答"不"。
在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,則避免進行float加法運算,因此也避免了錯誤累積。
為什么要投反對票?
我不是那個否決這個答案的人,但是如果我猜出來的話,因為您的輸出以0.0開頭,而不是0.1開頭。
@rgettman啊,是的-更改了1個字符,感謝您指出。我真的希望投票者會發表評論以表明這些事情。
浮點數是二進制的,不能很好地表示小數
如果適用,則以1/8或0.125進行迭代。
for(float i =1.0f;i<10f;i+=1f)
System.out.println(i/10f);`
很丑陋,但可以在這里使用(Ubuntu AMD64 OpenJDK)
浮動我?????????
引用我自己:這很丑陋,但是在這里有效。
嗯...看起來/聽起來像是我的伏都教解決方案。
引用自己:這很丑陋,但是在這里有效
...只要您繼續犧牲雞!!"它似乎行之有效",而沒有清楚地理解為什么編寫脆弱的,無法維護的代碼。我們應該不鼓勵新程序員使用這種編程方法……而不是向他們提供我們自己的伏都教編程"解決方案"以復制到他們的代碼中。
精彩。如果沒有可用的雞肉,則可以替代被詛咒的鴨子。這是我提到的"但可以在這里使用(Ubuntu AMD64 OpenJDK)":我不知道它是否可以在x86上運行(并且我不在乎)。對發生的情況的理解是微不足道的:1/10在任何二進制浮點數中都無法表示,無論精度如何。我不鼓勵任何人(無論有經驗的人)嘗試使0.1成為一個精確的浮點數..它只會起作用。我要說的是:這在指定的確切情況下有效。再多一點。
總結
以上是生活随笔為你收集整理的java中1和1.0_在Java中如何以0.1f增量在0.1f和1.0f之间进行迭代?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用类求两点间的距离
- 下一篇: 8086实时时钟实验(一)——《x86汇