ceil()
La funzione ceil() in PHP arrotonda un numero verso l'alto all'intero più vicino. Scopri sintassi, tipo di ritorno e casi d'uso pratici.
La funzione PHP ceil() arrotonda un numero verso l'alto al prossimo intero — verso l'infinito positivo. Il nome deriva da "soffitto" (ceiling in inglese): restituisce sempre il più piccolo valore intero maggiore o uguale all'input. Questa pagina spiega la sintassi, il tipo di ritorno (che spesso sorprende), il comportamento con i numeri negativi e i casi pratici in cui arrotondare verso l'alto è esattamente ciò di cui hai bisogno (paginazione, prezzi, dimensioni dei batch).
Sintassi
ceil(int|float $num): float$num— il valore da arrotondare. PHP accetta uninto unfloat; le stringhe numeriche vengono convertite automaticamente.- Valore di ritorno — il prossimo intero superiore, restituito come
float, non comeint(approfondiremo questo aspetto più avanti).
Esempio di base
4.2 è compreso tra 4 e 5, e ceil() si sposta sempre verso l'alto, quindi il risultato è 5. Anche 4.0001 viene arrotondato a 5. Un valore già intero viene restituito invariato.
ceil() restituisce un float
Questo inganna molti principianti: ceil() restituisce un float, anche se il valore sembra un intero.
<?php
$result = ceil(4.2);
echo $result; // 5 (echo hides the .0)
var_dump($result); // float(5)
echo gettype($result); // double
?>echo mostra 5 perché PHP omette il .0 finale nella stampa, ma il tipo sottostante è comunque float. Se hai bisogno di un vero int — ad esempio per usare il valore come chiave di array o per soddisfare un'indicazione di tipo strict — esegui un cast esplicito con intval() o (int):
<?php
$pages = (int) ceil(95 / 10);
var_dump($pages); // int(10)
?>Come ceil() gestisce i numeri negativi
Arrotondare "verso l'alto" significa spostarsi verso l'infinito positivo, quindi per i numeri negativi il risultato è più vicino allo zero, non più lontano.
<?php
echo ceil(-4.2); // -4 (toward zero, not -5)
echo "\n";
echo ceil(-4.8); // -4
?>-4.2 viene arrotondato a -4 perché -4 è maggiore di -4.2. Questa è la differenza fondamentale rispetto a un "aggiungi sempre 1" ingenuo — ceil() segue la retta dei numeri, non la grandezza.
ceil() vs. floor() vs. round()
Queste tre funzioni riducono tutte un numero a un valore intero, ma scelgono direzioni diverse:
| Funzione | Direzione | ceil(4.2) | floor(4.2) | round(4.2) |
|---|---|---|---|---|
ceil() | Sempre verso l'alto | 5 | — | — |
floor() | Sempre verso il basso | — | 4 | — |
round() | Al più vicino | — | — | 4 |
Usa ceil() quando "qualsiasi resto significa uno in più" — floor() scarta sempre la parte frazionaria, e round() sceglie il numero intero più vicino.
Casi d'uso pratici
Paginazione — quante pagine mi servono? Se hai 95 elementi e ne mostri 10 per pagina, l'ultima pagina parziale conta comunque:
<?php
$total_items = 95;
$per_page = 10;
$total_pages = ceil($total_items / $per_page);
echo $total_pages; // 10
?>95 / 10 è 9.5; floor() darebbe 9 e perderebbe gli ultimi 5 elementi, quindi ceil() è la scelta corretta qui.
Arrotondare un prezzo al centesimo superiore o addebitare in unità intere funziona allo stesso modo — qualsiasi resto ti porta all'unità successiva.
Insidie comuni
- Non è un intero. Confronta con i numeri, non con i tipi:
ceil(4.2) === 5èfalse(float vs int), mentreceil(4.2) == 5ètrue. Esegui il cast con(int)quando hai bisogno di un intero. - Precisione in virgola mobile. Poiché
$numè unfloat, piccoli errori di rappresentazione possono occasionalmente sorprenderti (ad esempio un valore che "dovrebbe" essere esattamente5.0ma viene memorizzato come5.00000001). Per le valute, preferisci i centesimi interi ai dollari in virgola mobile. - Direzione con i negativi. Ricorda che
ceil(-4.5)è-4, non-5.
Conclusione
ceil() arrotonda un numero verso l'alto al valore intero più vicino e lo restituisce come float. Usala ogni volta che una frazione residua deve "contare come uno in più" — paginazione, dimensionamento dei batch o prezzi. Abbinala alle sue funzioni sorelle floor() e round(), e converti il risultato con intval() quando hai effettivamente bisogno di un int.