round($x) rundet auf die nächste ganze Zahl, floor($x) rundet immer ab und ceil($x) rundet immer auf. Gib round() ein zweites Argument für Nachkommastellen: round(3.14159, 2) ist 3.14.
Alle drei liefern einen Float, auch wenn der Wert ganzzahlig ist. var_dump(round(5)) gibt float(5) aus, also castest du mit (int), wenn du eine Ganzzahl brauchst.
Auf 2 Nachkommastellen runden
Das zweite Argument von round() ist die Genauigkeit. Eine positive Zahl rundet auf so viele Nachkommastellen. Eine negative Zahl rundet links vom Dezimalpunkt, praktisch für grobe Angaben wie „etwa 1.200 Besucher“.
round(3.10, 2) gibt 3.1 aus, weil ein Float nicht weiß, wie viele Nullen du wolltest. Wenn die Zahl auf eine Seite kommt (Preise, Prozente), formatierst du sie stattdessen: number_format() macht mit number_format(3.1, 2) aus 3.1 den String "3.10", und sprintf('%.2f', $x) macht dasselbe.
Halb auf, halb ab oder halb zur geraden Zahl runden
Standardmäßig rundet round() eine Hälfte von null weg, also das kaufmännische Runden, das die meisten in der Schule gelernt haben. Das dritte Argument wählt eine andere Regel für Werte, die genau in der Mitte zwischen zwei Zahlen liegen.
PHP_ROUND_HALF_EVEN ist das „Banker's Rounding“: Hälften gehen zur nächsten geraden Zahl, sodass das Runden vieler Werte mit der Zeit nicht nach oben driftet. Buchhaltungscode will oft genau das.
floor und ceil mit negativen Zahlen
floor() bewegt sich in Richtung minus unendlich und ceil() in Richtung plus unendlich. Bei negativen Zahlen überrascht das: floor(-3.5) ist -4, nicht -3. Wenn du die Nachkommastellen in Richtung null abschneiden willst, castest du stattdessen nach int.
Die Zeile zur Seitennummerierung ist der klassische Einsatz von ceil(): Auch ein übrig gebliebener Eintrag braucht eine Seite.
Ganzzahlige Division und Modulo
/ liefert einen Float, wenn die Division nicht aufgeht, also ist 7 / 2 gleich 3.5. Für ganzzahlige Division verwendest du intdiv(), das den Rest verwirft, und % für den Rest selbst.
% wandelt beide Operanden zuerst in Ganzzahlen um, also ist 7.5 % 2 gleich 1, und seit PHP 8.1 gibt es außerdem Deprecated: Implicit conversion from float 7.5 to int loses precision aus. Verwende fmod(), wenn die Nachkommastellen zählen. Eine Division durch null mit /, intdiv() oder % wirft in PHP 8 einen DivisionByZeroError, also prüfe den Divisor vorher, wenn er aus einer Eingabe kommt.
Potenzen, Wurzeln, abs, max und min
** potenziert (pow() macht dasselbe), sqrt() zieht die Quadratwurzel und abs() entfernt das Vorzeichen. max() und min() nehmen entweder mehrere Argumente oder ein Array.
** wird von rechts nach links ausgewertet, also bedeutet 2 ** 3 ** 2 dasselbe wie 2 ** 9. Das Paar max(0, min(100, $x)) ist der übliche Weg, einen Wert zwischen eine untere und eine obere Grenze zu klemmen. M_PI enthält Pi, falls du es für Kreise brauchst.
Zufallszahlen mit random_int und rand
random_int($min, $max) liefert eine zufällige Ganzzahl, beide Enden eingeschlossen. Die Ausgabe ändert sich bei jedem Durchlauf, also klicke ein paarmal auf Run.
Verwende random_int() für alles, was mit Sicherheit zu tun hat: Login-Codes, Tokens, Links zum Zurücksetzen von Passwörtern. rand() und mt_rand() funktionieren weiterhin und nehmen dieselben Argumente ($min, $max), aber ihre Folge lässt sich vorhersagen. Zum Mischen und Auswählen mit einer sicheren Quelle kam mit PHP 8.2 Random\Randomizer ($r->getInt(1, 6), $r->shuffleArray($a)).
Warum floor() manchmal das falsche Ergebnis liefert
Floats werden binär gespeichert, und viele Dezimalwerte (wie 0.1) lassen sich nicht exakt speichern. Meistens versteckt die Ausgabe das, aber floor() und (int) runden nicht, sie schneiden ab, und ein Wert wie 7.999999999 wird zu 7.
Wenn du exakte Dezimalzahlen brauchst, etwa bei Geld, speicherst du ganze Einheiten (Cent als Ganzzahlen: 1999 statt 19.99) und teilst nur für die Anzeige. Vor floor() oder ceil() auf eine sinnvolle Genauigkeit zu runden, wie in der letzten Zeile, behebt ebenfalls die meisten Fälle.
Häufig gestellte Fragen
Wie runde ich in PHP auf 2 Nachkommastellen?
Übergib die Anzahl der Nachkommastellen als zweites Argument: round(3.14159, 2) liefert 3.14. Das Ergebnis ist ein Float, also verwendest du für die Anzeige mit fester Stellenzahl (3.10 statt 3.1) number_format($x, 2) oder sprintf('%.2f', $x).
Wie runde ich in PHP ab?
floor($x) rundet auf die nächstkleinere ganze Zahl ab: floor(4.9) ist 4 und floor(-4.1) ist -5. Um die Nachkommastellen stattdessen in Richtung null abzuschneiden, castest du mit (int) $x, was aus -4.9 den Wert -4 macht.
Warum liefert round() in PHP einen Float?
round(), floor() und ceil() liefern immer einen Float, auch wenn das Ergebnis ganzzahlig ist: var_dump(round(5)) gibt float(5) aus. Setze den Aufruf in (int) oder intval(), wenn du eine Ganzzahl brauchst, zum Beispiel als Array-Index.
Was ist der Unterschied zwischen rand() und random_int() in PHP?
random_int(1, 6) nutzt eine kryptografisch sichere Quelle und ist die richtige Wahl für Tokens, Codes und alles, was ein Nutzer zu erraten versuchen könnte. rand() und mt_rand() sind schneller, aber vorhersagbar. Alle drei schließen beide Enden des Bereichs ein.
Wie bekomme ich in PHP den Rest einer Division?
Mit dem Operator % für Ganzzahlen: 17 % 5 ist 2. Das Ergebnis übernimmt das Vorzeichen des linken Operanden, also ist -7 % 3 gleich -1. Für Floats verwendest du fmod(7.5, 2), das 1.5 liefert.