PHP 中浮点数 array_sum 求和精度丢失问题
首先给定一个数组:
// 该数组中,amount 为 float/double 或 string 不影响结果
$arr = [
[
'amount' => 1493.66
],
[
'amount' => 1493.66
],
[
'amount' => 1493.66
]
];
求和:
$amount = array_sum(array_column($arr, 'amount'));
我们已知晓的结果如下:
$result = 4480.98;
执行打印看看 $amount
和 $result
的实际值和比较结果:
dump($amount, $result, $amount === $result);
var_dump($amount, $result, $amount === $result);
// 以下是 dump 结果
\1^]8;;\ 4480.98
\2^]8;;\ 4480.98
\3^]8;;\ false
// 以下是 var_dump 结果
double(4480.98)
double(4480.98)
bool(false)
看上去是一样的,但实际上在执行 array_sum
的时候精度已经丢失,我们可以通过 var_export
得到确切的值:
var_dump(var_export($amount, true));
var_dump(var_export($result, true));
// 结果
string(18) "4480.9800000000005"
string(7) "4480.98"
解决方法一:
使用 bcmath
扩展
// 两个数相等时返回 0;num1 比 num2 大时返回 1;其他则返回 -1
$ret = bccomp($amount, $result);
if ($ret === 0) {
// 相等
} else {
// 不等
}
解决方法二:
转换成 string
即可
var_dump((string)$amount === (string)$result); // true
把 array_sum
后的值进行 string
转换后再转回 float/double
时也可以比较了
var_dump((float)(string)$amount === $result); // true
建议在涉及计算的过程中尽可能使用 bcmath 扩展确保精确度
原文地址:https://blog.csdn.net/maxsky/article/details/142764744
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!