PHP 8.4: Новые режимы округления в функции round()

Источник: «PHP 8.4: New rounding modes in round() function»
Функция round() округляет значение float до ближайшего целого числа или десятичного значения заданной точности. Она поддерживает различные режимы округления, а в PHP 8.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() поддерживала четыре метода округления:

В PHP 8.4 функция round() поддерживает четыре новых метода округления:

В следующей таблице приведены примеры возвращаемых значений:

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_CEILING12220-1-1-1
PHP_ROUND_FLOOR0111-1-2-2-2
PHP_ROUND_TOWARD_ZERO01110-1-1-1
PHP_ROUND_AWAY_FROM_ZERO1222-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_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_

Класс NumberFormatter в 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 8.4: Новые методы DateTime(Immutable)::createFromTimestamp

Следующая Статья

PHP 8.4: Новые методы DateTime(Immutable)::get/setMicroseconds