编程

PHP 8.4: round() 函数新增模式

718 2024-03-06 00:26:00

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.81.11.51.9-0.8-1.1-1.5-1.9
PHP_ROUND_HALF_UP1122-1-1-2-2
PHP_ROUND_HALF_DOWN1112-1-1-1-2
PHP_ROUND_HALF_EVEN1122-1-1-2-2
PHP_ROUND_HALF_ODD1112-1-1-1-2
PHP_ROUND_CEILING1222-0-1-1-1
PHP_ROUND_FLOOR0111-1-2-2-2
PHP_ROUND_TOWARD_ZERO0111-0-1-1-1
PHP_ROUND_AWAY_FROM_ZERO1222-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 modeNumberFormatter::ROUNDING_MODE value
PHP_ROUND_HALF_UPNumberFormatter::ROUND_HALFUP
PHP_ROUND_HALF_DOWNNumberFormatter::ROUND_HALFDOWN
PHP_ROUND_HALF_EVENNumberFormatter::ROUND_HALFEVEN
PHP_ROUND_HALF_ODDNumberFormatter::ROUND_HALFODD
PHP_ROUND_CEILINGNumberFormatter::ROUND_CEILING
PHP_ROUND_FLOORNumberFormatter::ROUND_FLOOR
PHP_ROUND_TOWARD_ZERONumberFormatter::ROUND_DOWN
NumberFormatter::ROUND_TOWARD_ZERO
PHP_ROUND_AWAY_FROM_ZERONumberFormatter::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_ZEROPHP_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。