php 7.3 的 array_sum 因底层用 double 导致大数精度丢失,须改用 bcmath 扩展;需启用扩展、设 bcscale、用 bcadd 遍历字符串化数值累加,确保整数精度。

PHP 7.3 中 array_sum 对超大整数或高精度浮点数求和时,会因底层使用 double 类型导致精度丢失(例如:9223372036854775807 + 1 可能变成 9.2233720368548E+18,再转回整数就出错)。要保证整数精度,必须改用 BCMath 扩展提供的任意精度运算函数。
确认 BCMath 已启用
运行 extension_loaded('bcmath') 或查看 phpinfo() 输出,确保 BCMath 扩展已开启。若未启用,请在 php.ini 中取消注释 extension=bcmath 并重启 PHP 服务。
用 bcscale 统一小数位数
BCMath 默认保留 0 位小数,但若数组含小数,需提前设置精度。例如需保留 10 位小数:
bcscale(10); // 全局生效,后续 bcadd/bcmul 等均按此精度计算
注意:bcscale 不影响整数运算结果,但对含小数的加法、除法等至关重要。
手动实现高精度数组求和
不能直接用 array_sum,需遍历并用 bcadd 累加。关键点:
- 初始值设为
'0'(字符串),避免类型自动转换 - 每个元素转为字符串再参与运算(
(string)$val),防止 float 被截断 - 跳过非数字字符串(可用
is_numeric初步过滤)
function bc_array_sum($arr) {
$sum = '0';
foreach ($arr as $val) {
if (!is_numeric($val)) continue;
$sum = bcadd($sum, (string)$val);
}
return $sum;
}
// 示例
$bigNumbers = ['9223372036854775807', '1', '999999999999999999999'];
echo bc_array_sum($bigNumbers); // 正确输出:1009223372036854775805
处理混合类型(整数/科学计数法/小数)
若输入含 1.23e4 或 123.456,需先标准化为常规十进制字符串:
- 用
sprintf('%.0F', $val)处理整数型 float(如1e10→'10000000000') - 对带小数的值,用
number_format($val, $scale, '.', '')避免本地千分位符干扰 - 推荐统一走
strval()+ 后续正则清理,或使用bcadd自动兼容多数格式
bcadd 内部可解析常见数字字符串格式,只要不包含空格、字母或非法符号即可,日常使用中优先转 (string) 即可覆盖绝大多数场景。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











