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

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.lryc.cn/news/458919.html

相关文章:

  • llava1.5论文阅读
  • 【学术会议投稿链接】React前端框架:构建现代Web应用的强大工具
  • Linux: network: tcp: sk_tx_skb_cache;4.18.0-283.el8;多分配内存
  • 电脑报错msvcp100.dll丢失怎么办?这些方法快速修复
  • pymc的安装还是pymc3?
  • 汉语言文学做大数据七年实际工作经验分享普通人快来围观
  • Linux使用Docker部署Paperless-ngx结合内网穿透打造无纸化远程办公
  • PointNet系列论文阅读与理解
  • 反转链表解题思路
  • 【MySQL 保姆级教学】数据库基础(重点)(2)
  • Nginx从入门到实战(八):版本平滑无感知,不停机升级
  • jQuery 用户登录页面非空校验与登录测试
  • 《Linux从小白到高手》综合应用篇:深入理解Linux进程调优
  • Linux安装elasticsearch单机版
  • el-table表头加红色星标
  • 2.1 HTML5 - Canvas标签
  • T-Box联网安全定义
  • 7. 整数反转【数学】
  • Windows环境NodeJS下载配置安装运行
  • 石化巡检必备神器,AORO A30防爆手机让“跑冒滴漏”无处藏身!
  • Smartfusion2开发环境的搭建
  • 使用C++编写一个语音播报时钟(Qt)
  • 架构师之路-学渣到学霸历程-11
  • Java Mail腾讯企业邮箱或其他邮箱发送邮件失败bug记录
  • 【大数据】HBase集群断电文件坏块导致集群无法启动处理
  • 400行程序写一个实时操作系统(三):Sparrow的学习方法
  • 为什么人工智能用 Python?
  • 【C++差分数组】P1672何时运输的饲料
  • Go基础知识:切片
  • Redis配置篇 - 指定Redis配置的三种方式,以及Redis配置文件介绍