ceil()
Функция ceil() в PHP округляет число вверх до ближайшего целого. Синтаксис, возвращаемый тип, работа с отрицательными числами и примеры.
Функция PHP ceil() округляет число вверх до следующего целого — в сторону положительной бесконечности. Название происходит от слова «ceiling» (потолок): функция всегда возвращает наименьшее целое значение, которое больше или равно входному числу. На этой странице рассматриваются синтаксис, неожиданный тип возвращаемого значения, поведение с отрицательными числами и практические случаи, когда округление вверх — это именно то, что нужно (пагинация, ценообразование, размеры партий).
Синтаксис
ceil(int|float $num): float$num— значение для округления. PHP принимаетintилиfloat; числовые строки преобразуются автоматически.- Возвращаемое значение — ближайшее большее целое число, возвращаемое как
float, а неint(подробнее об этом ниже).
Базовый пример
4.2 находится между 4 и 5, а ceil() всегда движется вверх, поэтому результат равен 5. Даже 4.0001 округляется до 5. Значение, которое уже является целым числом, возвращается без изменений.
ceil() возвращает float
Это часто сбивает с толку новичков: ceil() возвращает float, даже если значение выглядит как целое число.
<?php
$result = ceil(4.2);
echo $result; // 5 (echo hides the .0)
var_dump($result); // float(5)
echo gettype($result); // double
?>echo выводит 5, потому что PHP опускает завершающий .0 при выводе, однако внутренний тип по-прежнему float. Если вам нужен настоящий int — например, чтобы использовать значение как ключ array или удовлетворить строгую подсказку типа — явно приведите его с помощью intval() или (int):
<?php
$pages = (int) ceil(95 / 10);
var_dump($pages); // int(10)
?>Как ceil() обрабатывает отрицательные числа
Округление «вверх» означает движение в сторону положительной бесконечности, поэтому для отрицательных чисел результат ближе к нулю, а не дальше от него.
<?php
echo ceil(-4.2); // -4 (toward zero, not -5)
echo "\n";
echo ceil(-4.8); // -4
?>-4.2 округляется до -4, потому что -4 больше, чем -4.2. Это ключевое отличие от наивного подхода «всегда прибавить 1» — ceil() следует числовой прямой, а не абсолютной величине.
ceil() vs. floor() vs. round()
Все три функции приводят число к целому значению, но выбирают разные направления:
| Функция | Направление | ceil(4.2) | floor(4.2) | round(4.2) |
|---|---|---|---|---|
ceil() | Всегда вверх | 5 | — | — |
floor() | Всегда вниз | — | 4 | — |
round() | До ближайшего | — | — | 4 |
Используйте ceil(), когда «любой остаток означает ещё одну единицу» — floor() всегда отбрасывает дробную часть, а round() выбирает ближайшее целое.
Практические случаи применения
Пагинация — сколько страниц нужно? Если у вас 95 элементов и на странице отображается 10, последняя неполная страница тоже считается:
<?php
$total_items = 95;
$per_page = 10;
$total_pages = ceil($total_items / $per_page);
echo $total_pages; // 10
?>95 / 10 равно 9.5; floor() дал бы 9 и «потерял» последние 5 элементов, поэтому здесь правильный выбор — ceil().
Округление цены вверх до следующего цента или оплата целыми единицами работает так же — любой остаток переводит вас к следующей единице.
Распространённые ошибки
- Это не целое число. Сравнивайте по значению, а не по типу:
ceil(4.2) === 5равноfalse(float vs int), тогда какceil(4.2) == 5равноtrue. Используйте приведение(int), когда нужен целочисленный тип. - Точность с плавающей запятой. Поскольку
$numявляетсяfloat, незначительные ошибки представления могут иногда удивить вас (например, значение, которое «должно» быть ровно5.0, может храниться как5.00000001). Для работы с денежными суммами предпочитайте целые числа в центах вместо чисел с плавающей запятой в долларах. - Направление с отрицательными числами. Помните, что
ceil(-4.5)равно-4, а не-5.
Заключение
ceil() округляет число вверх до ближайшего целого и возвращает его как float. Используйте эту функцию всякий раз, когда дробный остаток должен «считаться за ещё одну единицу» — пагинация, размеры партий или ценообразование. Используйте её в паре с родственными функциями floor() и round(), а результат приводите через intval(), когда вам действительно нужен int.