Округление чисел в PHP

Автор: Igor Kirsanov

Округление чисел проводится согласно определенным способам округления.

Например, существует математическое округление, округление в большую сторону, меньшую сторону, до десятков, банковское ..., способов как округлить числов достаточно много.

Основные функции окргуления до целого числа встроенные в PHP

  • ceil - округляет в большую сторону, тип float.
  • floor - в меньшую сторону, тип mixed.

Пример


// 4 тестовых значения
$value1 = 1.7;
$value2 = 1.4;
$value3 = 12345678912345.999999999999999999999999999999999;
$value4 = 12345678912345.99;

// Округление в большую сторону
echo ceil($value1); // 2
echo ceil($value2); // 2
echo ceil($value3); // 12345678912346
echo ceil($value4); // 12345678912346

// Округление в меньшую сторону
echo floor($value1); // 1
echo floor($value2); // 1
echo floor($value3); // 12345678912346 - обратить внимание
echo floor($value4); // 12345678912345

Для обычных данных из прайс-листа данные функции вполне подходят, но для анализа статистических данных лучше использовать специализированные решения.

Математическое округление до целого

Функция round предназначена для округления дробных чисел, типа float.

По умолчанию округление производится до целого числа, согласно математическим правилам округления чисел.


echo round($value1); // 2
echo round($value2); // 1
echo round($value3); // 12345678912346
echo round($value4); // 12345678912346

Округление дробного числа до x знаков после запятой

Вторым параметром функции round является количество знаков после запятой, которое может принимать отрицательные значения.


// данные для проверки
$value1 = 1.7;
$value2 = 1.74;
$value3 = 12345.999999999999999999999999999999999;
$value4 = 12345.88;

echo round($value1, 2);  // 1.7 - нули не добавляются 1.70
echo round($value2, 1);  // 1.7 - округление по умолчанию математическое
echo round($value3, 5);  // 12346 - выход за допустимый диапазон, округление до целого
echo round($value4, -1); // 12350 - округление до десятков
echo round($value4, -2); // 12300 - округление до сотен
echo round($value4, -4); // 10000 - округление до десяти тысяч
echo round($value4, -5); // 0 - значение не определено, вышли за диапазон

Задание способа округления функции round

Третий параметр (константа) функции round задает способ округления

PHP_ROUND_HALF_UP - Округляет val в большую сторону от нуля до precision десятичных знаков, если следующий знак находится посередине. Т.е. округляет 1.5 в 2 и -1.5 в -2.

PHP_ROUND_HALF_DOWN - Округляет val в меньшую сторону к нулю до precision десятичных знаков, если следующий знак находится посередине. Т.е. округляет 1.5 в 1 и -1.5 в -1.

PHP_ROUND_HALF_EVEN - Округляет val до precision десятичных знаков в сторону ближайшего четного знака.

PHP_ROUND_HALF_ODD - Округляет val до precision десятичных знаков в сторону ближайшего нечетного знака.

Банковское округление, до ближайшего четного числа

Банковское округление (англ. banker's rounding) - округление к ближайшему чётному, то есть 2,5 → 2, 3,5 → 4

Используя константу PHP_ROUND_HALF_EVEN функции round и округление до целого, напишем способ банковского округления числа на php.


$value1 = 2.5;
$value2 = 3.5;
echo round($value1, 0, PHP_ROUND_HALF_EVEN); // 2
echo round($value2, 0, PHP_ROUND_HALF_EVEN); // 4

Округление целого числа кратного 10, 100


$value1 = 104;
$value2 = 111.5;
$value3 = 144;
$value4 = 1;

// Используя функцию round, не всегда ожидаемое поведение
// Лучше использовать разделить и умножить на 10, как в функции ceil ниже

// до 10
echo round($value1, -1); // 100
echo round($value2, -1); // 110
echo round($value3, -1); // 140
echo round($value4, -1); // 0 - выход за диапазон
// до 100
echo round($value1, -2); // 100
echo round($value2, -2); // 110
echo round($value3, -2); // 140
echo round($value4, -2); // 0 - вместо округления, 0

// Функция ceil выдает ожидаемый результат
// до 10
echo ceil($value1/10) * 10; // 110
echo ceil($value2/10) * 10; // 120
echo ceil($value3/10) * 10; // 150
echo ceil($value4/10) * 10; // 10
// до 100
echo ceil($value1/100) * 100; // 200
echo ceil($value2/100) * 100; // 200
echo ceil($value3/100) * 100; // 200
echo ceil($value4/100) * 100; // 100

Округление до 5

Пример округления до 5 приведен для функции ceil, для round и floor - аналогично.


$value1 = 104;
$value2 = 105;
$value3 = 150;
$value4 = 200;

echo ceil($value1/5) * 5; // 105
echo ceil($value2/5) * 5; // 105
echo ceil($value3/5) * 5; // 150
echo ceil($value4/5) * 5; // 200

Данный пример округления кратного 5 встречается наиболее часто, так же существуют варианты когда необходимо не включать само число

echo ceil(($value2+5/2)/5)*5; // 110 вместо 105

или нужно окргулить до ближайшего целого числа, кратного 5


// значения
$n = 50.25;
$x = 5;

// округление до ближайшего числа кратного 5
echo (round($n)%$x === 0) ? round($n) : round(($n+$x/2)/$x)*$x; // 50

// округление вначале до целого, после до ближайшего кратного 5
echo (ceil($n)%$x === 0) ? ceil($n) : round(($n+$x/2)/$x)*$x; // 55