php浮点数比较应避免==,推荐用bccomp()进行精确比较,但需确保bcmath扩展已启用;若只需近似相等,可用abs($a - $b)
PHP浮点数直接用 == 或
因为二进制无法精确表示大多数十进制小数,
0.1 + 0.2在 PHP 中不等于0.3,而是约等于0.30000000000000004。直接用==、、<code>>比较会受精度丢失影响,结果不可靠。常见错误现象:
if (0.1 + 0.2 == 0.3)返回false;循环中用$i += 0.1控制次数,可能多跑一次或少跑一次。
- 这不是 PHP 特有,所有遵循 IEEE 754 的语言都这样
- 用
abs($a - $b) 是临时解法,但阈值难选:太大会误判,太小又绕不开精度问题- 涉及金额、科学计算、配置阈值等场景,必须换更稳的方式
bccomp 函数怎么正确比较两个浮点数
bccomp是 PHP 的 BCMath 扩展函数,把数字转成字符串后按十进制逐位比大小,完全规避二进制浮点误差。但它不接受 float 类型参数——传入0.1会被先转成字符串,而(string)0.1可能变成"0.10000000000000001",反而引入新误差。正确做法是:所有原始值必须以字符串字面量传入
bccomp。立即学习“PHP免费学习笔记(深入)”;
- ✅ 正确:
bccomp('0.1', '0.2', 10)- ❌ 错误:
bccomp(0.1, 0.2, 10)(先转 float 再转 string,已失真)bccomp第三个参数$scale表示小数点后保留几位参与比较,不是四舍五入,而是截断后比。比如bccomp('1.234', '1.235', 2)等价于比'1.23'和'1.23',返回0- 返回值:1(左 > 右)、-1(左
什么时候该用 bccomp,什么时候不该用
bccomp不是万能替代品。它适合需要确定性十进制比较的场景,但代价是性能和类型约束。
- 适合:金融计算(如判断余额是否 ≥ 扣款金额)、配置项数值校验(如
max_upload_size >= '2.5')、测试断言中验证计算结果- 不适合:高频循环里的简单大小判断(比如数组排序中的 compare 函数),
bccomp比原生运算慢一个数量级以上- 注意:
bccomp要求 BCMath 扩展已启用,线上环境需确认extension=bcmath已加载,否则报致命错误Call to undefined function bccomp()- 如果只是判断“是否近似相等”,且允许微小误差,用
abs($a - $b) 更轻量;但一旦涉及业务逻辑分支(如“≥ 就扣款”),就必须用 <code>bccomp+ 字符串输入替代方案:floatval() + delta 判断的适用边界
有人用
floatval()强制转回 float 再比,这毫无意义——它只是重复触发精度问题。真正可控的近似比较,只依赖合理选取的 delta 值。
- delta 选多少?货币场景通常用
1e-2(分),科学计算看有效位数,一般1e-6~1e-10足够- 但要注意:delta 不能解决
1e10 + 0.1 == 1e10这类浮点溢出导致的恒等假象,此时bccomp仍唯一可靠- PHP 8.2+ 提供了
is_finite()和is_nan(),建议在比较前加一层检查,避免拿INF或NAN直接参与运算事情说清了就结束。关键就一条:要严格十进制语义,
bccomp必须配字符串输入;任何从 float 变量开始的链路,都可能在第一步就毁掉精度保证。
0
0
相关文章
php8.5无法安装扩展怎么办_宝塔面板php8.5扩展安装不上解决方法
PHP 使用 SSL 连接数据库配置方法
PHP怎么替换多个字符 PHP批量替换字符串内容【技巧】
php操作PPT文件中的图片排列与对齐方式
PHP怎么把字符串转成日期对象_PHP字符串转日期操作步骤【操作】
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。
950
2023.08.02
css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。
594
2024.04.28
if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。
841
2023.08.22
js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。
718
2023.08.03
js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。
219
2023.09.04
java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。
1561
2023.10.24
字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。
647
2023.11.24
本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。
19
2026.03.05
热门下载
相关下载
精品课程




