intdiv()
Разбираем функцию intdiv() в PHP: целочисленное деление, отличия от операторов / и %, обработка ошибок и примеры.
Функция intdiv() в PHP выполняет целочисленное деление: она делит одно целое число на другое и возвращает целую часть частного, отбрасывая остаток. Функция была введена в PHP 7.0, чтобы дать явный и понятный способ выразить «сколько раз B вмещается в A» без использования оператора / и ручного приведения типов.
На этой странице описывается, что возвращает intdiv(), чем она отличается от операторов / и %, как обрабатывает отрицательные числа и числа с плавающей точкой, а также как справляться с исключениями, которые она может выбрасывать.
Синтаксис
intdiv(int $num1, int $num2): int$num1— делимое (число, которое делится).$num2— делитель (число, на которое делят).- Возвращает частное
$num1 / $num2какint, дробная часть отбрасывается.
Базовый пример
10 / 3 равно 3.333…, поэтому intdiv() сохраняет целую часть 3, отбрасывая 0.333….
intdiv() vs. операторы / и %
Обычный оператор деления / всегда возвращает float, если числа не делятся нацело, тогда как intdiv() всегда возвращает int. Оператор остатка от деления % даёт остаток, который intdiv() отбрасывает. Вместе intdiv() и % позволяют восстановить исходное число:
<?php
echo 10 / 3; // 3.3333333333333 (float)
echo "\n";
echo intdiv(10, 3); // 3 (int quotient)
echo "\n";
echo 10 % 3; // 1 (remainder)
echo "\n";
// quotient * divisor + remainder == dividend
echo intdiv(10, 3) * 3 + (10 % 3); // 10
?>Используйте intdiv(), когда вам действительно нужен целочисленный результат — например, при разбивке элементов на страницы, переводе секунд в минуты или распределении количества по фиксированным группам.
Усечение в сторону нуля
intdiv() усекает в сторону нуля, а не в сторону отрицательной бесконечности. Это важно при работе с отрицательными операндами и является частым источником ошибок, когда предполагается поведение «округления вниз»:
<?php
echo intdiv(7, 2); // 3
echo "\n";
echo intdiv(-7, 2); // -3 (not -4)
echo "\n";
echo intdiv(7, -2); // -3
echo "\n";
echo intdiv(-7, -2); // 3
?>-7 / 2 равно -3.5; усечение в сторону нуля даёт -3. (Если вам нужно поведение функции floor, используйте floor(-7 / 2), которая возвращает -4.)
Обработка ошибок
intdiv() выбрасывает исключение в двух случаях, от которых следует защититься:
- Деление на ноль выбрасывает
DivisionByZeroError. intdiv(PHP_INT_MIN, -1)выбрасываетArithmeticError, потому что математически корректный результат превышает максимальное значение, которое может хранить целое число.
<?php
function safeIntdiv($a, $b) {
try {
return intdiv($a, $b);
} catch (DivisionByZeroError $e) {
return "Cannot divide by zero";
} catch (ArithmeticError $e) {
return "Result out of integer range";
}
}
echo safeIntdiv(20, 4); // 5
echo "\n";
echo safeIntdiv(20, 0); // Cannot divide by zero
?>Примечание:
intdiv()ожидает целочисленные аргументы. Число с плавающей точкой, например7.9, будет приведено к целому (дробная часть отбрасывается) до выполнения деления, поэтомуintdiv(7.9, 2)ведёт себя какintdiv(7, 2). Для деления с сохранением дробной части используйте функциюfmod()или оператор/.
Заключение
Функция intdiv() предоставляет надёжный и явный способ выполнять целочисленное деление в PHP. Помните, что она усекает в сторону нуля, что отброшенный остаток доступен через %, и что она может выбрасывать DivisionByZeroError и ArithmeticError. Подробнее о числовых операциях см. в разделах PHP Math, PHP Operators и PHP Numbers.