round($x) округляет до ближайшего целого, floor($x) всегда округляет вниз, а ceil($x) всегда вверх. Передайте round() второй аргумент, чтобы задать число знаков после запятой: round(3.14159, 2) даёт 3.14.
Все три возвращают float, даже если значение целое. var_dump(round(5)) печатает float(5), поэтому, когда нужно целое число, приводите через (int).
Округление до 2 знаков после запятой
Второй аргумент round() это точность. Положительное число округляет до стольких знаков после запятой. Отрицательное округляет слева от десятичной точки, что удобно для приблизительных цифр вроде "около 1 200 посетителей".
round(3.10, 2) выводит 3.1, потому что float понятия не имеет, сколько нулей вы хотели. Когда число выводится на страницу (цены, проценты), форматируйте его: number_format() превращает 3.1 в "3.10" через number_format(3.1, 2), и sprintf('%.2f', $x) делает то же самое.
Половина вверх, вниз или к чётному
По умолчанию round() округляет половину от нуля, это то самое округление, которое большинство учило в школе. Третий аргумент выбирает другое правило для значений, которые ровно посередине между двумя числами.
PHP_ROUND_HALF_EVEN это "банковское округление": половины идут к ближайшему чётному числу, поэтому при округлении множества значений сумма со временем не уползает вверх. В бухгалтерском коде часто нужно именно оно.
floor и ceil с отрицательными числами
floor() движется к минус бесконечности, а ceil() к плюс бесконечности. С отрицательными числами это удивляет: floor(-3.5) даёт -4, а не -3. Если нужно просто отбросить дробную часть (в сторону нуля), приводите к int.
Строка с пагинацией это классическое применение ceil(): любому оставшемуся элементу всё равно нужна страница.
Целочисленное деление и остаток
/ возвращает float, когда деление не нацело, поэтому 7 / 2 даёт 3.5. Для деления нацело используйте intdiv(), которая отбрасывает остаток, а для самого остатка %.
% сначала приводит оба операнда к целым, поэтому 7.5 % 2 даёт 1, а начиная с PHP 8.1 ещё и печатает Deprecated: Implicit conversion from float 7.5 to int loses precision. Если важна дробная часть, используйте fmod(). Деление на ноль через /, intdiv() или % в PHP 8 выбрасывает DivisionByZeroError, поэтому проверяйте делитель, если он приходит из ввода.
Степени, корни, abs, max и min
** возводит в степень (pow() делает то же), sqrt() извлекает квадратный корень, а abs() убирает знак. max() и min() принимают либо несколько аргументов, либо один массив.
** вычисляется справа налево, поэтому 2 ** 3 ** 2 означает 2 ** 9. Пара max(0, min(100, $x)) это обычный способ зажать значение между нижней и верхней границей. В M_PI хранится число пи, если оно нужно для окружностей.
Случайные числа через random_int и rand
random_int($min, $max) возвращает случайное целое, включая оба конца. Вывод меняется при каждом запуске, так что нажмите Run несколько раз.
Используйте random_int() для всего, что связано с безопасностью: коды входа, токены, ссылки для сброса пароля. rand() и mt_rand() по-прежнему работают и принимают те же аргументы ($min, $max), но их последовательность можно предсказать. Для перемешивания и выбора со стойким источником в PHP 8.2 появился Random\Randomizer ($r->getInt(1, 6), $r->shuffleArray($a)).
Почему floor() иногда даёт неверный ответ
Float хранятся в двоичном виде, и многие десятичные значения (например, 0.1) нельзя сохранить точно. Обычно вывод это скрывает, но floor() и (int) не округляют, а отсекают, и значение вроде 7.999999999 становится 7.
Когда нужны точные десятичные значения, как с деньгами, храните целые единицы (центы целыми числами: 1999 вместо 19.99) и делите только при выводе. Округление до разумной точности перед floor() или ceil(), как в последней строке, тоже исправляет большинство случаев.
Часто задаваемые вопросы
Как округлить до 2 знаков после запятой в PHP?
Передайте количество знаков вторым аргументом: round(3.14159, 2) возвращает 3.14. Результат это float, поэтому для вывода с фиксированным числом знаков (3.10, а не 3.1) используйте number_format($x, 2) или sprintf('%.2f', $x).
Как округлить вниз в PHP?
floor($x) округляет вниз до ближайшего меньшего целого: floor(4.9) даёт 4, а floor(-4.1) даёт -5. Чтобы вместо этого отбросить дробную часть в сторону нуля, приведите к int через (int) $x, тогда -4.9 превратится в -4.
Почему round() в PHP возвращает float?
round(), floor() и ceil() всегда возвращают float, даже если результат целый: var_dump(round(5)) печатает float(5). Оберните вызов в (int) или intval(), когда нужно целое число, например индекс массива.
Чем rand() отличается от random_int() в PHP?
random_int(1, 6) использует криптографически стойкий источник, и именно её нужно брать для токенов, кодов и всего, что пользователь может попытаться угадать. rand() и mt_rand() быстрее, но предсказуемы. Все три включают оба конца диапазона.
Как получить остаток от деления в PHP?
Для целых используйте оператор %: 17 % 5 даёт 2. Результат получает знак левого операнда, поэтому -7 % 3 даёт -1. Для float используйте fmod(7.5, 2), она вернёт 1.5.