2012-10-25 197 views
0
<?php 
    $last_percent = 0; 
    $as = array("110.800002098083", "30", "36.1499996185303", "11", "13", "13.9899997711182", "74.5200042724609", "13.9899997711182"); 
    $t = 304.46000552177; 
    foreach($as as $a) { 
     $last_percent += round($a*100/$t, 2); 
    } 
    var_dump($last_percent); 
    $last_percent = 100 - $last_percent; 
    var_dump($last_percent); 
?> 

爲什麼結果是0.33000000000001?爲什麼它只發生在100和99?如果我使用$ last_percent = 90 - $ last_percent; 結果是-9.67PHP瘋狂bug

+2

浮動。點。數學。 – rdlowrey

+2

[每個計算機科學家應該知道的關於浮點算術](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – sachleen

+1

http://php.net/manual/ en/language.types.float.php < - 有一個帶有警告的大紅色框。閱讀。 – hakre

回答

1

當您需要100%的精度時,浮點計算不可靠。 PHP文檔在這裏有關於它的官方警告http://php.net/manual/en/language.types.float.php,如果您需要高精度的計算,您應該使用任意的精度數學函數或gmp函數。

+5

*「使用浮點數字時,PHP是不可實現的。」* ... PHP **不是**不可靠的,*浮點數學*是不精確的。 – rdlowrey

+1

對不起,真的,這不是PHP,它的浮點問題 –

+1

@ElenaSharovar - 再怎麼樣[編輯答案】(http://stackoverflow.com/posts/13061289/edit)這麼說? – ghoti

4

簡單的答案是浮點值不完美。有時,根據您的系統設置,有錯誤。

較長的答案是浮點值不是數值的精確表示,它們是近似值 - 在大多數情況下 - 足夠好。問題是,有時候你想要的值會落入浮點不能完美運行的區域,並且你會得到類似這樣的錯誤。

這就是爲什麼依賴精確值的系統(如金融應用程序)不使用浮點數的原因。它們使用特殊用途的高精度類型,或者用兩個獨立的整數值表示美元和美分。

0

爲什麼浮點數是不準確的:

他們把小數位二進制小數的化合物。 1/2 + 1/4 + 1/8 + 1/16 + ...

並非所有的數字都可以完美表示,所以它只是給你它是'最好的嘗試'。