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_DOWN NumberFormatter::ROUND_TOWARD_ZERO |
PHP_ROUND_AWAY_FROM_ZERO | NumberFormatter::ROUND_UP NumberFormatter::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
。