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

Функция 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_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 8.4: Новые методы DateTime(Immutable)::createFromTimestamp

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

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