2013-08-23 54 views
0

我有一個數組:PHP:求和陣列值的結果是錯誤的

$test =array('49'=> '-0','51'=> '-0','50'=> '0','53'=> '-1.69','55'=> '0','57'=> '-2','59'=> '-6','60'=> '-12','65'=> '0','66'=> '0','67'=> '21.69','69'=> '0','70'=> '0','71'=> '0',); 

echo "\n".'===== First Method ========'; 
echo "\n\n".print_r($test); 
echo "\n array_sum: ".array_sum($test); 
echo "\n\n".'===== Second Method ========'; 

$total = 0;foreach($test as $value) $total += $value; 
echo "\n foreach:".$total."\n"; 

結果是

[email protected]:~/Desktop$ php test.php 

===== First Method ========Array 
(
    [49] => -0 
    [51] => -0 
    [50] => 0 
    [53] => -1.69 
    [55] => 0 
    [57] => -2 
    [59] => -6 
    [60] => -12 
    [65] => 0 
    [66] => 0 
    [67] => 21.69 
    [69] => 0 
    [70] => 0 
    [71] => 0 
) 


1 
array_sum: 3.5527136788005E-15 

===== Second Method ======== 
foreach:3.5527136788005E-15 

它是錯誤的,結果應該是0,不3.5527136788E-15,如何解決它?

+2

您應該使用換行符重新格式化該代碼,以使其易於閱讀。另外,首先想到的是,你正在總結可能會遭受鑄造錯誤的字符串。這感覺很像浮點精度錯誤。 –

+0

那麼,男士應該用什麼樣的貝殼? –

回答

2

這只是你的standard floating point arithmetic precision error

php -r "echo -1.69 + -2 + -6 + -12 +21.69;" 
3.5527136788005E-15% 

您可以通過使用整數而不是浮動來修復它。例如,如果你總是希望2位精度,乘以100所有的數字,圓了他們對整型,它們求和,然後除以100

php -r "echo (-169 + -200 -1200 +2169 + -600)/100;" 
0%            
1

你正在用字符串做array_sum。除去值上的引號,或者在使用array_sum之前將它們隱藏爲整數 - 我想它會將字符串錯誤地轉換爲整數 - 只能在我的手機上進行,因此無法檢查具體內容。

希望這會有所幫助。

0

爲什麼不只是將值作爲浮點數而不是將它們括在引號中。這基本上會使它成爲一個字符串求和,並且期望有奇怪的結果。我認爲在PHP版本4之前,它曾經將字符串轉換爲數字。它可能特別是十進制數字的問題。

+0

整數?真?是1.69是一個整數? – leon

+0

意思是浮點數。對不起...... –

+0

當你嘗試對它們進行數學運算時,PHP會自動將字符串轉換爲數字 - 如果他不使用引號,他會得到完全相同的結果。 –

0

這僅僅是浮點不精確的例子。完全用二進制表示.69是不可能的(很像用十進制表示1/3是不可能的)。

如果你需要確切的數字,你可以看看使用bcmath php擴展。