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
- Реализация