0

我有一个数组:

$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

4 回答 4

2

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

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%                                               
于 2013-08-24T00:03:11.537 回答
1

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

希望这可以帮助。

于 2013-08-24T00:00:39.890 回答
0

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

于 2013-08-24T00:02:45.460 回答
0

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

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

于 2013-08-24T00:03:39.953 回答