php:求和数组值的结果是错误的


php : result of sum array values is wrong

我有一个数组:

$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";

结果是

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

它是错误的,结果应该是0,而不是3.5527136788E-15,如何修复?

这只是您的标准浮点算术精度错误。

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

您可以使用int而不是float来修复它。例如,如果您总是期望2位数的精度,请将所有数字乘以100,四舍五入为int,求和,然后除以100。

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

您正在使用字符串执行array_sum。删除值上的引号,或者在使用array_sum之前将其转换为整数——我想这是错误地将字符串转换为整数的——只有在我的手机上,所以无法检查细节。

希望这能有所帮助。

为什么不将值作为浮点数而不是用引号括起来呢。这基本上会使它成为一个字符串求和,并且会出现奇怪的结果。我认为在PHP版本4之前,它曾将字符串转换为数字。这可能尤其是十进制数字的问题。

这只是浮点不精确的一个例子。用二进制表示.69是不可能的(就像用十进制表示1/3也是不可能的)。

如果您需要确切的数字,可以考虑使用bcmath-php扩展。