floor() 向负无穷取整,正数向下、负数更小(如floor(-2.1)=-3),返回float类型(如floor(5)=5.0),非简单截断;需向零取整用(int)或intval(),防浮点误差应优先整数运算。

PHP floor() 对整数和浮点数都有效,但结果可能不符合直觉
floor() 的作用是“向负无穷取整”,不是简单去掉小数部分。对正数来说确实是向下取整,比如 floor(3.9) 得 3;但对负数,floor(-2.1) 返回 -3(不是 -2)。很多人误以为它等价于“截断小数”,其实不是。
- 如果目标是“往零取整”(即丢掉小数部分,不管正负),该用
intval()或(int)强制转换 -
floor()接收一个 float,返回 int 类型(PHP 8.0+ 可能返回 float,取决于输入是否超出 int 范围) - 传入字符串如
"4.7"会先被隐式转为 float,但"abc"会转成0,容易埋雷
为什么 floor(5) 返回 5.0 而不是 5?
PHP 中 floor() 总是返回 float 类型(除非启用了严格类型且函数声明了返回 int)。即使输入是整数,比如 floor(5),结果仍是 5.0 —— 这不是 bug,是 PHP 的历史设计。如果你需要 int 类型,得手动转换:
var_dump((int) floor(5)); // int(5) var_dump(floor(5.7)); // float(5)
- PHP 8.0+ 支持
floor()的返回类型声明为float|int,但实际行为仍取决于输入值大小 - 在类型敏感场景(如 JSON 编码、数据库写入),
5.0和5可能被不同对待 - 别依赖
gettype(floor(5)) === 'integer',它几乎总是'double'
替代方案:什么时候不该用 floor()?
当你要处理的是“四舍五入到最近整数”或“向上取整”,floor() 就不合适。比如分页计算总页数:ceil($total / $per_page) 才对,用 floor() 会少算一页。
- 向下取整(正数):可用
floor(),但注意负数行为 - 向零取整(安全截断):优先用
(int)$x或intval($x) - 大整数(> PHP_INT_MAX):
floor()可能精度丢失,应改用 BCMath 或 GMP - 从字符串解析数字再取整:先用
filter_var($str, FILTER_VALIDATE_FLOAT)校验,避免静默转成0
常见错误:floor() 在浮点运算后失效
浮点数不精确会导致 floor() 行为反直觉。例如 floor(0.1 + 0.2) 不是 0,而是 0.0?错 —— 实际上 0.1 + 0.2 是 0.30000000000000004,floor() 仍返回 0.0,看似没问题。但更危险的是 floor(100 * 0.07):本该是 7,却因 100 * 0.07 算出 6.999999999999999,floor() 直接变成 6.0。
立即学习“PHP免费学习笔记(深入)”;
- 涉及金额、百分比、索引计算时,优先用整数运算:
floor((int)round($a * 100) / 100)不可靠,应转为“分”再算 - 调试时用
var_dump($val, sprintf('%.17f', $val))查看真实浮点值 - 不要对
microtime(true)的差值直接floor(),先round($diff, 3)再处理
浮点误差本身不可消除,floor() 只是把它暴露出来。关键不是换函数,而是提前把计算锚定在整数域。











