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

时间:2013-08-23 23:56:56

标签: 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";

结果是

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,如何解决?

4 个答案:

答案 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 :(得分:1)

您正在使用字符串执行array_sum。删除值的引号,或在使用array_sum之前将它们转换为整数 - 我想它正在将字符串错误地转换为整数 - 仅在我的手机上,因此无法检查细节。

希望这有帮助。

答案 2 :(得分:0)

为什么不将值设为浮点数,而不是将它们括在引号中。这基本上会使它成为字符串求和,并且预计会出现奇怪的结果。我认为在PHP版本4.之前它用于将字符串转换为数字。十进制数可能特别有问题。

答案 3 :(得分:0)

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

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