Beim Programmieren stößt man immer wieder auf Situationen, in denen eine Zahl aufgerundet werden muss. PHP stellt dafür die Funktion ceil() bereit, die eine Fließkommazahl auf die nächste ganze Zahl aufrundet. Dieses Tutorial zeigt dir, wie ceil() funktioniert, welche Stolperfallen es gibt und wann du besser zu floor() oder round() greifst.
So funktioniert ceil()
Die Funktion erwartet einen numerischen Wert und gibt die nächsthöhere Ganzzahl zurück. Falls der Wert bereits ganzzahlig ist, bleibt er unverändert.
<?php
echo ceil(4.3); // 5
echo ceil(9.999); // 10
echo ceil(5.0); // 5
echo ceil(-3.7); // -3
?>
Bei negativen Zahlen rundet ceil() in Richtung Null. Aus -3.7 wird also -3, nicht -4. Das ist ein häufiger Stolperstein, den man im Hinterkopf behalten sollte.
ceil() im Vergleich zu floor() und round()
PHP bietet neben ceil() noch zwei weitere Rundungsfunktionen. Welche die richtige ist, hängt vom Anwendungsfall ab.
graph LR
A["4.3"] -->|"ceil()"| B["5"]
A -->|"floor()"| C["4"]
A -->|"round()"| D["4"]
E["4.7"] -->|"ceil()"| F["5"]
E -->|"floor()"| G["4"]
E -->|"round()"| H["5"]
<?php
$zahl = 4.5;
echo ceil($zahl); // 5 (aufrunden)
echo floor($zahl); // 4 (abrunden)
echo round($zahl); // 5 (kaufm. runden)
$zahl2 = 4.4;
echo round($zahl2); // 4
echo ceil($zahl2); // 5
?>
floor() rundet immer ab, round() rundet kaufmännisch (ab 0.5 aufgerundet). ceil() rundet dagegen immer auf, egal wie klein der Nachkommaanteil ist.
Vorsicht bei Fließkomma-Ungenauigkeiten
Fließkommazahlen werden intern als Binärwerte gespeichert, und manche Dezimalwerte lassen sich nicht exakt abbilden. Das kann zu unerwarteten Ergebnissen bei ceil() führen.
<?php
$ergebnis = (0.7 + 0.1) * 10;
echo $ergebnis; // 7.9999999999...
echo ceil($ergebnis); // 8
/*
* Man erwartet 8.0, aber intern ist
* der Wert 7.9999... Deshalb rundet
* ceil() auf 8, was zufaellig stimmt.
*/
$ergebnis2 = (0.1 + 0.2) * 10;
echo $ergebnis2; // 3.0000000000...
echo ceil($ergebnis2); // 4 (!)
?>
Die Lösung: Runde den Wert vorher mit round() auf eine sinnvolle Genauigkeit, bevor du ceil() anwendest.
<?php
$wert = (0.1 + 0.2) * 10;
/* Vorher auf 10 Stellen runden */
echo ceil(round($wert, 10)); // 3
?>
Praxisbeispiel: Seitenanzahl berechnen
Ein typischer Einsatz von ceil() ist die Berechnung der Seitenanzahl bei einer Pagination. Wenn du 47 Einträge hast und pro Seite 10 anzeigst, brauchst du 5 Seiten.
<?php
$eintraege = 47;
$pro_seite = 10;
$seiten = ceil($eintraege / $pro_seite);
echo "Seitenanzahl: $seiten"; // 5
?>
Ohne ceil() würde 47 / 10 den Wert 4.7 ergeben. Mit normalem Type-Casting oder floor() ginge der letzte Rest verloren. ceil() stellt sicher, dass auch die restlichen 7 Einträge eine eigene Seite bekommen.
Praxisbeispiel: Versandkosten berechnen
Ein weiterer klassischer Einsatz ist die Berechnung von Versandkosten nach Gewichtsstufen. Pakete werden pro angefangenes Kilogramm berechnet, und genau dafür ist ceil() gemacht.
<?php
function berechneVersand(float $gewichtKg): float
{
$preisProKg = 2.50;
$grundgebuehr = 4.99;
/*
* Jedes angefangene Kilogramm
* wird voll berechnet
*/
$stufen = ceil($gewichtKg);
return $grundgebuehr + ($stufen * $preisProKg);
}
echo berechneVersand(2.3);
/* 4.99 + (3 * 2.50) = 12.49 */
echo berechneVersand(1.0);
/* 4.99 + (1 * 2.50) = 7.49 */
?>
Ein Paket mit 2,3 kg wird auf 3 Stufen aufgerundet. So zahlst du für jedes angefangene Kilogramm den vollen Preis. Dasselbe Prinzip funktioniert bei Stundenabrechnungen, Speicherplatz-Kontingenten oder Lizenzmodellen.
Vorsicht bei Kommazahlen als String
In deutschsprachigen Ländern wird als Dezimaltrennzeichen ein Komma verwendet, PHP erwartet aber einen Punkt. Das kann zu überraschenden Ergebnissen führen.
<?php
$mit_punkt = "4.3";
echo ceil($mit_punkt); // 5
$mit_komma = "4,3";
echo ceil($mit_komma); // 4 (!)
?>
Der String "4,3" wird von PHP als 4 interpretiert, weil das Komma den numerischen Teil abschneidet. Wenn Benutzereingaben mit Komma ankommen können, solltest du vorher str_replace(",", ".", $eingabe) verwenden.
<?php
$eingabe = "4,3";
$bereinigt = str_replace(",", ".", $eingabe);
if (is_numeric($bereinigt)) {
echo ceil((float) $bereinigt); // 5
} else {
echo "Keine gültige Zahl.";
}
?>
Mit is_numeric() prüfst du zusätzlich, ob der bereinigte Wert tatsächlich eine Zahl ist, bevor du ihn an ceil() übergibst.
Verwandte Tutorials
Diese Tutorials ergänzen das Thema Rundung in PHP: