欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > PHP 中浮点数 array_sum 求和精度丢失问题

PHP 中浮点数 array_sum 求和精度丢失问题

2024/10/23 15:28:50 来源:https://blog.csdn.net/maxsky/article/details/142764744  浏览:    关键词: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 扩展确保精确度

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com