php:sum数组值的结果是错误的

I have an array:

$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 "
".'===== First Method ========';
echo "

".print_r($test);
echo "
 array_sum: ".array_sum($test);
echo "

".'===== Second Method ========';

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

the result is

gd@gd:~/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

it is wrong, the result should be 0, not 3.5527136788E-15, how to fix it ?

This is just your standard floating point arithmetic precision error.

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

You can fix it by using ints rather than floats. For example, if you always expect 2 digits of precision, multiply all your numbers by 100, round them off to ints, sum them, and divide by 100.

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

You are doing array_sum with strings. Remove the quotes on the values, or covert them to integers before using array_sum - I imagine it is converting the strings to integers incorrectly - only on my phone so can't check specifics.

Hope this helps.

Why not just give the values as floating point numbers rather than enclosing them in quotes. That would basically make it a string summation and strange result is expected. I think in before PHP version 4.something it used to convert the string to numbers. It might especially be problem with decimal numbers.

This is just an example of floating point imprecision. It's impossible to represent .69 exactly in binary (much like it's impossible to represent 1/3 exactly in decimal).

If you need exact numbers, you can look into using the bcmath php extension.