当前位置: 首页 > article >正文

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 扩展确保精确度

http://www.kler.cn/news/340059.html

相关文章:

  • 关于PPT生成的开源大模型总结
  • 【自动驾驶】控制算法(十二)横纵向综合控制 | 从理论到实战全面解析
  • 基于单片机的温度和烟雾检测
  • 解决雪花ID在前端精度丢失问题
  • TypeScript速成班:一篇文章搞定
  • attain和obtain区别
  • 无领导小组讨论|无领导小组讨论问题|无领导小组讨论答题框架
  • 数据结构之图(6)
  • 【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器
  • ps学习官方网址
  • 入门篇-1 数据结构简介
  • 零信任身份安全如何做到安全防护
  • 【web安全】——逻辑漏洞
  • 120页满分PPT | 企业级业务架构和IT架构规划方案
  • C++ 线程池设计
  • 基于单片机的智能浇花系统
  • AI编程工具的机遇与风险
  • Linux中设置cd命令后直接显示当前目录下的所有文件
  • 深入浅出React Hooks:打造高效、灵活的函数式组件
  • 电源管理芯片PMIC