PHP 8.3 的 round() 函数行为与 PHP 7.4 一致,支持三参数(数值、精度、舍入模式)和四种舍入模式,但受浮点精度限制需谨慎用于金融计算。

PHP 8.3 中的 round() 函数用法和行为与 PHP 7.4 及之后版本保持一致,没有新增参数或语义变更,核心仍是精确、可控的四舍五入。
基础语法和默认行为
round() 接收三个参数:数值、精度、舍入模式,后两者可选。
- 不传精度时,默认四舍五入到个位(
$precision = 0) - 精度为正数(如
2),表示保留小数点后两位 - 精度为负数(如
-1),表示对整数部分按十位、百位等舍入
例如:
round(3.14159) → 3round(3.14159, 2) → 3.14round(1234.5, -2) → 1200
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
支持四种舍入模式(mode 参数)
PHP 8.3 完整支持以下 $mode 常量,用于控制“恰好是 0.5”这类边界情况:
立即学习“PHP免费学习笔记(深入)”;
-
PHP_ROUND_HALF_UP(默认):0.5 向上进位 →round(2.5, 0) → 3 -
PHP_ROUND_HALF_DOWN:0.5 向下舍去 →round(2.5, 0, PHP_ROUND_HALF_DOWN) → 2 -
PHP_ROUND_HALF_EVEN(银行家舍入):0.5 舍入到最近偶数 →round(2.5, 0, PHP_ROUND_HALF_EVEN) → 2;round(3.5, 0, PHP_ROUND_HALF_EVEN) → 4 -
PHP_ROUND_HALF_ODD:0.5 舍入到最近奇数(极少使用)
处理浮点精度问题的实用建议
由于二进制浮点表示限制,像 1.005 这类数在底层可能存储为略小于 1.005 的值,导致 round(1.005, 2) 返回 1.00 而非预期的 1.01。应对方法包括:
- 对关键场景(如金额),先用
number_format($val, 3, '.', '')转成字符串再转回 float,或改用 BCMath(如bcadd($val, '0.0005', 3)后截断) - 若只需显示用途,直接用
number_format($val, 2)—— 它按字符串处理,结果更符合直觉 - 避免依赖
round()做金融结算;应结合bcmul/bcadd等高精度函数
常见误用提醒
注意几个易错点:
-
round()返回的是 float 类型,不是字符串;如需补零(如3.10),需额外格式化 - 精度为
0和省略精度效果相同,但显式写round($x, 0)更清晰 - 负精度舍入时,是对“整数位”的数量级操作,不是简单去掉小数——
round(999.9, -1) → 1000,不是990


















