php整型相除默认返回浮点数,intdiv()实现向零截断的整除;floor/ceil/round需经浮点运算,大整数有精度风险,且语义不同。

PHP整型相除默认是浮点结果,不是整数
PHP里两个 int 相除(比如 5 / 2),结果永远是 float 类型,哪怕能整除(4 / 2 得 2.0)。这不是 bug,是语言设计——PHP 没有整除运算符,/ 就是纯浮点除法。
所以“保留整数”不是“截掉小数”,而是明确选择一种整数取整策略:向下取整?向零截断?四舍五入?还是向负无穷取整?不同场景要的不是同一个结果。
用 intdiv() 做向零截断的整除
intdiv() 是 PHP 7+ 提供的真正整除函数,它对两个整数做除法后直接返回 int,行为等价于向零取整(truncation):
-
intdiv(5, 2)→2 -
intdiv(-5, 2)→-2(不是-3) -
intdiv(5, -2)→-2 -
intdiv(-5, -2)→2
注意:intdiv() 要求两个参数都必须是整数,传 float 会报 TypeError;除零直接抛 DivisionByZeroError。别用 (int)(a / b) 替代——它在负数时行为不一致(比如 (int)(-5 / 2) 是 -2,看似一样,但底层靠类型转换,语义模糊且易被误读)。
立即学习“PHP免费学习笔记(深入)”;
需要向下取整(floor)或向上取整(ceil)?别用 intdiv()
如果业务逻辑要求“至少分多少份”(向上取整)或“最多能完整分几份”(向下取整),intdiv() 不适用:
- 向下取整(floor):用
floor($a / $b),但结果是float,需再强转(int)floor($a / $b);负数时和intdiv()不同,例如floor(-5 / 2)是-3.0→-3 - 向上取整(ceil):同理,
(int)ceil($a / $b),ceil(-5 / 2)是-2.0 - 四舍五入:用
round($a / $b),注意它默认四舍五入到整数,但中间仍经过浮点计算,大整数可能因精度丢失出错
这些方式都绕不开浮点中间值,对超大整数(接近 PHP_INT_MAX)有风险;而 intdiv() 全程整数运算,更安全。
兼容旧版本 PHP(
PHP 5.x 没有 intdiv(),只能手动模拟。最稳妥的是:
- 先用
intval($a / $b)或(int)($a / $b)——但只适用于非负数,负数时行为不可靠 - 写个兼容函数,显式判断符号后用绝对值算再加符号:
function intdiv_compat($a, $b) { if ($b === 0) { throw new DivisionByZeroError(); } $q = intval(abs($a) / abs($b)); return ($a < 0) ^ ($b < 0) ? -$q : $q; }
这个函数行为和原生 intdiv() 一致,但多了函数调用开销;如果项目已升级到 PHP 7+,直接用原生函数,别封装别兼容。
真正容易被忽略的点是:PHP 整除不是数学意义上的“商”,而是明确的向零截断;很多开发者下意识以为 5 / 2 “应该”得 2,却没意识到负数时 -5 / 2 的预期结果到底是 -2 还是 -3——这得看你的业务逻辑,而不是语言默认。选错取整方式,线上可能出负数索引越界、分页错乱这类隐蔽问题。











