intdiv() 返回精确整型商且向下取整,/ 总返回浮点数并可能精度丢失;intdiv() 要求整型参数、负数时严格按 floor division 规则,而 / 仅向零截断,二者类型与语义均不可互换。

PHP 中 / 和 intdiv() 的结果类型完全不同
用 / 做除法,结果永远是 float(哪怕能整除),而 intdiv() 强制返回 int,且只接受整数参数。这不是风格差异,是类型契约的硬性区别。
-
/会把10 / 2算成5.0(类型是float),后续参与数组键、match表达式或严格比较时可能意外失败 -
intdiv(10, 2)返回5(类型是int),但传入intdiv(10.5, 2)会直接报TypeError - 如果被除数或除数是字符串数字(如
"10"),/会静默转为 float 计算;intdiv()则要求必须是整型值,否则抛异常
负数除法时,/ 向零截断,intdiv() 向负无穷取整
这是最常踩坑的地方:PHP 的整除不是简单“去掉小数”,而是遵循数学上的向下取整(floor division),和 Python 的 // 一致,但和 C/Java 的 /(向零)不同。
-
intdiv(-7, 3)返回-3(因为-3 × 3 = -9 ≤ -7,而-2 × 3 = -6 > -7) -
-7 / 3得到约-2.333...,强制 (int) 转换会截断为-2,但这不是整除,只是丢弃小数部分 - 想模拟
intdiv()行为但不用它?别用(int)(-7 / 3),改用floor(-7 / 3)—— 但注意floor()返回float,仍需 (int) 转,且性能略差
精度问题只在 / 中存在,intdiv() 完全规避浮点误差
当操作大整数(接近 PHP_INT_MAX)时,/ 可能因 float 精度丢失导致错误商,intdiv() 在参数合法前提下始终精确。
- 比如
9223372036854775807 / 1(即PHP_INT_MAX / 1),在 64 位系统上/可能返回9.2233720368548E+18这种科学计数 float,再转 int 就变9223372036854800000—— 错了 -
intdiv(9223372036854775807, 1)稳稳返回原值9223372036854775807(int 类型) - 所以涉及 ID、分页偏移、内存块对齐等必须精确整数的场景,只要确定是整除,优先选
intdiv()
替代方案:floor($a / $b) 不等于 intdiv($a, $b)
很多人以为用 floor() 包一层就能复刻 intdiv(),但负数时逻辑错位——floor() 是向下取整,而整除定义本身已包含符号处理规则。
立即学习“PHP免费学习笔记(深入)”;
-
floor(-7 / 3)→floor(-2.333...)→-3✅(碰巧对) -
floor(-6 / 3)→floor(-2)→-2✅ -
floor(-8 / 3)→floor(-2.666...)→-3✅ - 但
floor(7 / -3)→floor(-2.333...)→-3,而intdiv(7, -3)也是-3;intdiv(-7, -3)是2,floor(-7 / -3)是floor(2.333...)→2✅——看起来都对? - 等等:PHP 规定
intdiv($a, $b)要求$a === $b * intdiv($a, $b) + fmod($a, $b),而floor($a/$b)不保证余数非负;实际中,只要 $b > 0,floor($a/$b)和intdiv($a,$b)结果一致;但 $b
真要兼容老版本 PHP(($a - fmod($a, $b)) / $b 或判断符号后调 abs + intdiv 模拟,别图省事套 floor。










