PHP 8.4: round() 函数新增模式
round() 函数将浮点值四舍五入到最近的整数或者指定精度的小数。它支持多种四舍五入模式,而 PHP 8.4 添加了 4 种新的四舍五入方法
round(3.14, precision: 0, mode: PHP_ROUND_HALF_UP); // 3.0
round(3.14, precision: 1, mode: PHP_ROUND_HALF_UP); // 3.1
round(3.15, precision: 0, mode: PHP_ROUND_HALF_UP); // 3.0
round(3.5, precision: 0, mode: PHP_ROUND_HALF_UP); // 4.0在 PHP 8.4 之前,round() 函数支持 4 种四舍五入方法:
PHP_ROUND_HALF_UP: 当数字到达一半时,将数字从零四舍五入,将 1.5 变为 2,将 -1.5 变为 -2。常数值int(1)。PHP_ROUND_HALF_DOWN: 当数字达到一半时,将其向零四舍五入,将 1.5 变为 1,将 -1.5 变为 -1。常数值int(2)。PHP_ROUND_HALF_EVEN: 当数字达到一半时,将其向最接近的偶数值舍入,使 1.5 和 2.5 都变为 2。常数值int(3)。PHP_ROUND_HALF_ODD: 当数字到达一半时,将其向最近的奇数取整,将 1.5 变为 1,将 2.5 变为 3。常数值int(4)。
在 PHP 8.4 中,round() 函数支持下列 4 种新增的四舍五入方法:
PHP_ROUND_CEILING: 让数字向比其大的最近整数取整,使 1.1 和 1.5 取整到 2 以及让 -1.1 和 -1.5 取整为 -1。当$precision参数为0, 返回值与ceil函数的返回值相同。常数值为int(5)。PHP_ROUND_FLOOR: 取整数字到比该数字小的最近整数值,使 1.1 和 1.9 取整为 1、使 -1.9 和 -1.1 取整为 -2。返回值以floor函数相同。常数值int(6)。PHP_ROUND_TOWARD_ZERO: 让数字向零取整,使 1.9 和 1.1 取整到 1、使 -1.9 和 -1.1 取整为 -1。常数值int(7)。PHP_ROUND_AWAY_FROM_ZERO: 让数字取整远离零,让 1.1 和 1.9 取整为 2、让 -1.1 和 -1.9 取整为 -2。常数值int(8)。
下表通过示例总结了返回值:
| 0.8 | 1.1 | 1.5 | 1.9 | -0.8 | -1.1 | -1.5 | -1.9 | |
|---|---|---|---|---|---|---|---|---|
PHP_ROUND_HALF_UP | 1 | 1 | 2 | 2 | -1 | -1 | -2 | -2 |
PHP_ROUND_HALF_DOWN | 1 | 1 | 1 | 2 | -1 | -1 | -1 | -2 |
PHP_ROUND_HALF_EVEN | 1 | 1 | 2 | 2 | -1 | -1 | -2 | -2 |
PHP_ROUND_HALF_ODD | 1 | 1 | 1 | 2 | -1 | -1 | -1 | -2 |
PHP_ROUND_CEILING | 1 | 2 | 2 | 2 | -0 | -1 | -1 | -1 |
PHP_ROUND_FLOOR | 0 | 1 | 1 | 1 | -1 | -2 | -2 | -2 |
PHP_ROUND_TOWARD_ZERO | 0 | 1 | 1 | 1 | -0 | -1 | -1 | -1 |
PHP_ROUND_AWAY_FROM_ZERO | 1 | 2 | 2 | 2 | -1 | -2 | -2 | -2 |
使用 Intl 扩展 NumberFormatter 取整
Intl 扩展的 NumberFormatter 类也提供了取整功能,并增加了本地化数字功能。
NumberFormatter 类也支持同杨的取整模式,将属性 (NumberFormatter::ROUNDING_MODE) 配置给对象。精度使用 NumberFormatter::FRACTION_DIGITS 属性设置:
$formatter = new \NumberFormatter("en-US", \NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 0);
$formatter->setAttribute(NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFUP);
$formatter->format(1.1);下表显示了每个 round() 取整模式对应的 NumberFormatter::ROUNDING_MODE 属性值。
round mode | NumberFormatter::ROUNDING_MODE value |
|---|---|
PHP_ROUND_HALF_UP | NumberFormatter::ROUND_HALFUP |
PHP_ROUND_HALF_DOWN | NumberFormatter::ROUND_HALFDOWN |
PHP_ROUND_HALF_EVEN | NumberFormatter::ROUND_HALFEVEN |
PHP_ROUND_HALF_ODD | NumberFormatter::ROUND_HALFODD |
PHP_ROUND_CEILING | NumberFormatter::ROUND_CEILING |
PHP_ROUND_FLOOR | NumberFormatter::ROUND_FLOOR |
PHP_ROUND_TOWARD_ZERO | NumberFormatter::ROUND_DOWNNumberFormatter::ROUND_TOWARD_ZERO |
PHP_ROUND_AWAY_FROM_ZERO | NumberFormatter::ROUND_UPNumberFormatter::ROUND_AWAY_FROM_ZERO |
新增 Intl NumberFormatter::ROUND_ 常量
PHP 8.4 中的 NumberFormatter 类也声明了如下三个常量:
NumberFormatter::ROUND_TOWARD_ZERO(值为int(2)):NumberFormatter::ROUND_DOWN的别名,用来与round()函数的PHP_ROUND_TOWARD_ZERO模式保持一致性。NumberFormatter::ROUND_AWAY_FROM_ZERO(值为int(3)):NumberFormatter::ROUND_UP的别名,用来与round()函数的PHP_ROUND_AWAY_FROM_ZERO模式保持一致性。NumberFormatter::ROUND_HALFODD(值为int(8)): 为补充NumberFormatter::ROUND_HALFEVEN功能,不过该尝试在 PHP 8.4 之前并未声明。
向后兼容性影响
PHP_ROUND_CEILING, PHP_ROUND_FLOOR, PHP_ROUND_TOWARD_ZERO 和 PHP_ROUND_AWAY_FROM_ZERO 是 PHP 8.4 中声明的新常量
Intl 扩展的 NumberFormatter 类添加了 NumberFormatter::ROUND_TOWARD_ZERO 作为 NumberFormatter::ROUND_DOWN 的别名,以及 NumberFormatter::ROUND_AWAY_FROM_ZERO 作为 NumberFormatter::ROUND_UP 的别名。
更进一步,Intl 扩展的 NumberFormatter 类也声明了新的 NumberFormatter::ROUND_HALFODD,它提供了 round() 函数 PHP_ROUND_HALF_ODD 模式同样的功能。该常数未在 PHP 8.4 之前声明,虽然已经存在 NumberFormatter::ROUND_HALFEVEN。