PHP 精度计算问题(精确算法)
2023-02-18 16:45:56 时间
1. PHP 中的精度计算问题
当使用 php 中的 +-*/
计算浮点数时, 可能会遇到一些计算结果错误的问题
这个其实是计算机底层二进制无法精确表示浮点数的一个 bug, 是跨域语言的, 比如 js 中的 舍入误差
所以大部分语言都提供了用于精准计算的类库或函数库, 比如 php 中的 bc 高精确度函数库, js 中的 toFixed()
如下所示: 将计算结果浮点数 58 转为整数后结果是 57, 而不是 58
$result = 0.58 * 100;
var_dump(intval($result)); // 57
js 中的舍入误差: 0.1 + 0.2 的计算结果为 0.30000000000000004, 此时可以使用 toFixed()
函数处理, 使其返回正确的结果
2. PHP 中的 bc 高精确度函数库
常用的高精度函数
// 高精度加法
bcadd(string $num1, string $num2, int $scale = 0);
// 高精度减法
bcsub(string $num1, string $num2, int $scale = 0);
// 高精度乘法
bcmul(string $num1, string $num2, int $scale = 0);
// 高精度除法
bcdiv(string $num1, string $num2, int $scale = 0);
// 比较两个高精度数字
bccomp(string $num1, string $num2, int $scale = 0);
特别注意:
从 PHP7 开始, 很多框架中都使用了严格模式(比如: TP6), 在严格模式下, 函数实参和形参的数据类型必须一致
bc 系列函数库前两个参数要求是字符串类型, 第三个参数为可选参数, 用于设置结果中小数点后的小数位数, 返回值为字符串
3. 推荐文章
PHP 精度计算问题: https://www.cnblogs.com/xiezhi/p/5688029.html
相关文章
- [html] 同一页面的跳转,锚文本的使用方法
- [PHP] 解决宝塔面板运行php项目 pcntl_fork() has been disabled for security reasons
- 论文解读丨无参数的注意力模块SimAm
- 华为云企业级Redis揭秘第15期:Redis为什么需要强一致?
- 带你了解AKG正反向算子注册+关联流程
- 软件开发除了23种设计模式,还有7个开发原则需要了解
- Sechunter移动应用隐私合规检测详解
- 数仓如何限制临时数据文件下盘量
- 关于HTTPS认证,这里解决你所有疑惑
- 分析师机构发布中国低代码平台现状分析报告,华为云AppCube为数字化转型加码
- 云小课 | SA基线检查—给云服务的一次全面“体检”
- 并发高?可能是编译优化引发有序性问题
- 不止承上启下,带你了解工业物联网关
- 面试只要问到分布式,必问分布式锁
- 你真的懂Redis的5种基本数据结构吗?
- 从原理带你掌握Spring MVC拦截处理器知识
- 论文解读二十七:文本行识别模型的再思考
- 论文解读丨LayoutLM: 面向文档理解的文本与版面预训练
- 教你用SQL进行数据分析
- 解密并发幕后黑手:线程切换引发的原子性问题