PHP 8.4: Новые режимы округления в функции round()
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()
поддерживала четыре метода округления:
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()
поддерживает четыре новых метода округления:
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,9 в -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
Класс NumberFormatter
из расширения Intl
также обеспечивает функциональность округления с дополнительным преимуществом локализации чисел.
Класс 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);
В следующей таблице приведены соответствующие значения атрибута NumberFormatter::ROUNDING_MODE
для каждого режима округления round()
.
Режим round | Значение NumberFormatter::ROUNDING_MODE |
---|---|
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_
Класс NumberFormatter
в PHP 8.4 также объявляет три константы:
NumberFormatter::ROUND_TOWARD_ZERO
(со значениемint(2)
): Псевдоним дляNumberFormatter::ROUND_DOWN
, чтобы соответствовать режимуPHP_ROUND_TOWARD_ZERO
функцииround()
.NumberFormatter::ROUND_AWAY_FROM_ZERO
(со значениемint(3)
): Псевдоним дляNumberFormatter::ROUND_UP
, чтобы соответствовать режимуPHP_ROUND_AWAY_FROM_ZERO
функцииround()
.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.
Класс NumberFormatter
из расширения Intl добавляет 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
уже существовала.
Связанные изменения
- PHP RFC: Add 4 new rounding modes to round() function
- [RFC] [Discussion] Add 4 new rounding modes to round() function
- Реализация