php算术运算符需警惕隐式类型转换、优先级误判和浮点精度问题;如0.1+0.2!==0.3;建议用intdiv()替代/做整除,浮点比较改用abs($a-$b)

PHP 算术运算符不是“+ - * /”就完事了
PHP 的算术运算符表面简单,但实际用错的地方集中在隐式类型转换、优先级误判和浮点精度这三块。比如 $a = 0.1 + 0.2 === 0.3 返回 false,不是语法错,是浮点表示本身的问题。
实操建议:
- 整数运算尽量用
intdiv()替代/,避免意外返回 float(比如intdiv(7, 2)得3,而7 / 2是3.5) - 做等值判断时,别直接用
==比浮点结果,改用abs($a - $b) -
%运算符对负数取模结果依赖 PHP 版本:PHP 7+ 与数学定义一致(符号随被除数),但老代码若依赖旧行为,得显式用fmod()
++ 和 -- 在表达式里到底先算还是后算
很多人以为 $i++ 就是“加完再用”,其实它是在整个表达式求值完成之后才自增——而且这个“完成”取决于运算符优先级和结合性,不是语句顺序。
常见错误现象:
立即学习“PHP免费学习笔记(深入)”;
-
echo $i++ + $i++;在 PHP 8 中结果不可预测(未定义行为),PHP 7.4 已警告,别这么写 -
$arr[$i++] = $i;行为取决于$i初始值和 PHP 版本,PHP 7.4+ 按从左到右求值,但依然不推荐混用
安全做法:一条语句只出现一次自增/自减,拆成两行更清晰:
易语言入门教程 CHM,介绍易语言的系统基本数据类型、常量表、运算符、位运算命令以及易语言支持库方面的问题,易语言所编写的程序运行时都需要加载易语言的支持库文件.表面上易语言的非独立编译所生成的EXE程序体积小巧.但事实上若想把软件发布出去给别人的电脑上使用.非独立编译将面临很多的问题.所以实际应用时应全部进行独立编译。
$arr[$i] = $i; $i++;
指数运算符 ** 的兼容性和陷阱
** 是 PHP 5.6 引入的,比 pow() 更直观,但它不是简单替代——尤其在类型和精度上。
使用场景与差异:
-
2 ** 3返回8(int),但2.0 ** 3返回8.0(float),类型会“传染” -
0 ** 0在 PHP 中是1(符合多数语言惯例),但数学上无定义;0 ** -1直接报Division by zero - 大指数如
2 ** 1000可能溢出或转为INF,而pow(2, 1000)行为相同,但错误提示略不同
字符串参与算术运算时发生了什么
PHP 会尝试把字符串转成数字,但转换规则容易踩坑:空格开头?带单位?含字母?全影响结果。
典型表现:
-
"123abc" + 1得124(前面数字部分被截取) -
"abc123" + 1得1(无法开头解析,当作0) -
" 42 " + 1得43(自动 trim 空格) -
"1e2" + 1得101(科学计数法被识别)
如果你真要算字符串里的数,先用 filter_var($str, FILTER_SANITIZE_NUMBER_FLOAT) 清洗,再用 (float) 强转,比依赖隐式转换可靠得多。
最常被忽略的是:这种自动转换只发生在算术运算符上下文里,== 或 === 不触发——所以别指望 "123" == 123 + 0 能帮你绕过类型问题。









