我有一个数组:
$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,如何解决?
答案 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扩展。