2013-06-29 40 views
4

我有這樣的代碼:PHP for循環顯示奇怪的結果

for($i = 1; $i <= $max; $i+=0.1) { 
    echo "$i<br>"; 
} 

如果變量$max = 6;結果是:1, 1.1, 1.2, 1.3 .... 5.8, 5.9, 6,但是當變量$max = 4的結果是:1, 1.1 ... 3.8, 3.9,但數量4丟失。

請解釋這種行爲,並解決這個問題。

的結果是相同的,當我使用條件時$max2, 3 or 4

+0

我覺得這是與舍入的問題:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html 事實上,錯誤不是丟失的4,而是打印6 –

+2

讀取關於浮點精度的紅色塊。 [浮點數](http://php.net/manual/en/language.types.float.php) – bitWorking

+1

如果我修改循環「的($ I = 1; $ I <= $最大值; $ I + = 0.1)'問題仍然相同 –

回答

1

你應該設置精度當使用整數時,

這樣的:

$e = 0.0001; 
    while($i > 0) { 
    echo($i); 
    $i--; 
} 
4

http://php.net/manual/en/language.types.float.php

此外,有理數了用作浮動精確表示$i <= $max;$i < $max;

時發生錯誤基數10中的點數(如0.1或0.7)不具有與基數2中的浮點數一樣的內部使用的精確表示形式,無論尾數的大小。因此,他們不能被轉換成其內部的二進制對應,而不會有小的精度損失。

因此,要克服這一點,你可以用10 所以$max是40或60乘以你的號碼

for($i = 10; $i <= $max; $i+=1) { 
    echo ($i/10).'<br>'; 
} 
2
$err = .000001//allowable error 
for($i = 1; $i <= $max+$err; $i+=0.1) { 
    echo "$i<br>"; 
} 
+0

謝謝,這也解決了這個問題。請提出答案。 –

3
You can use of number_format() 

<?php 
$max=6; 
for($i = 1; number_format($i,2) < number_format($max,2); $i+=0.1) { 
echo $i."<br>";  
} 

?>

+1

偉大的解決方案! – sinisake

+1

效果很好!謝謝 –

+0

設置'$ max' = 100,看看會發生什麼。在我的情況下,舍入錯誤從54.2開始。 – bitWorking