2012-05-12 84 views
5
for($i=0;$i<=2;$i+=0.1){ 
    echo $i."<br>"; 
} 

我希望結果是:爲什麼在達到預期值之前停止循環?

0 
0.1 
0.2 
0.3 
0.4 
0.5 
0.6 
0.7 
0.8 
0.9 
1 
1.1 
1.2 
1.3 
1.4 
1.5 
1.6 
1.7 
1.8 
1.9 
2 

會發生什麼事,而不是爲循環達到1.9和停止。爲什麼?

+4

@Brad,由於用於清潔起來。你讓這個問題更具可讀性和可挽救性。 +1的問題!也許我們應該在投票之前更仔細地看一個問題,因爲我們絕對有能力扭轉這個問題。 – jmort253

回答

0

這並不是由於浮點精度工作。這些數字以基礎2格式存儲,並且由於四捨五入而不準確。當你將.1加到1.9時,你最終不會得到2.0。你最終得到像1.99999這樣的東西。在下一次迭代中,您最終會得到類似2.099998的內容,具體取決於基礎2格式的內容。

欲瞭解更多信息,請參閱Floating point numbersDouble-precision floating-point format

你也可以做這樣的東西,得到的結果你是後

for ($i = 0; $i < 2.1; $i += .1){ 
    echo $i . '<br />'; 
} 
+0

這就是我所謂的貧民窟。 – Strawberry

+0

問題是「爲什麼它不起作用」,所以除了代碼之外,關於浮點數的一些解釋會讓你得票。 – Spudley

+0

謝謝,現在我明白了! – Jelly

5

因爲,它永遠不會實現floating point == integer

+0

+1正確。如果你想這個工作,你需要檢查是否== 2.0 – EmmanuelG

0

你可以通過:

for($i=0;$i<=20;$i+=1){ 
    echo ($i/10)."<br>"; 
} 
相關問題