Signatur
Beschreibung
RoundingMode ist ein PHP-Enum (seit PHP 8.4), das verschiedene mathematische Rundungsstrategien als typsichere Konstanten bereitstellt. Er ersetzt die bisher genutzten Integer-Konstanten PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN usw. und macht Code lesbarer sowie refactoring-sicherer.
Das Enum enthält Cases für die klassischen "Hälfte"-Rundungen (z. B. 2,5 → 3 oder 2), aber auch für das kaufmännische Runden, das Runden zu geraden bzw. ungeraden Zahlen (Banker's Rounding) sowie für das strikte Auf- oder Abrunden unabhängig vom Nachkommawert.
Typische Einsatzgebiete sind Finanzanwendungen (bei denen ein neutrales Runden gegenüber systematischen Fehlern bevorzugt wird), wissenschaftliche Berechnungen oder überall dort, wo das Standard-Aufrunden nicht gewünscht ist. Die Cases werden direkt an round() (ab PHP 8.4) als mode-Parameter übergeben.
- HalfAwayFromZero – klassisches kaufmännisches Runden (0,5 weg von 0). Entspricht dem früheren
PHP_ROUND_HALF_UPfür positive Zahlen. - HalfTowardsZero – 0,5 wird Richtung 0 gerundet.
- HalfEven – Banker's Rounding: 0,5 wird zur nächsten geraden Zahl gerundet (minimiert systematische Fehler).
- HalfOdd – 0,5 wird zur nächsten ungeraden Zahl gerundet.
- TowardsZero – immer Richtung 0 (Trunkierung).
- AwayFromZero – immer von 0 weg.
- NegativeInfinity – immer abrunden (floor).
- PositiveInfinity – immer aufrunden (ceil).
Beispiele
Klassisches und Banker's Rounding im Vergleich
<?php
// PHP 8.4+
$value = 2.5;
echo round($value, mode: RoundingMode::HalfAwayFromZero) . PHP_EOL; // 3
echo round($value, mode: RoundingMode::HalfTowardsZero) . PHP_EOL; // 2
echo round($value, mode: RoundingMode::HalfEven) . PHP_EOL; // 2 (nächste gerade Zahl)
echo round($value, mode: RoundingMode::HalfOdd) . PHP_EOL; // 3 (nächste ungerade Zahl)
$value2 = 3.5;
echo round($value2, mode: RoundingMode::HalfEven) . PHP_EOL; // 4 (nächste gerade Zahl)
echo round($value2, mode: RoundingMode::HalfOdd) . PHP_EOL; // 3 (nächste ungerade Zahl)
Richtungs-Rundungen: AwayFromZero, TowardsZero, NegativeInfinity, PositiveInfinity
<?php
// PHP 8.4+
$positive = 2.3;
$negative = -2.3;
// Immer von 0 weg (wie abs(ceil) für positive, abs(floor) für negative)
echo round($positive, mode: RoundingMode::AwayFromZero) . PHP_EOL; // 3
echo round($negative, mode: RoundingMode::AwayFromZero) . PHP_EOL; // -3
// Immer Richtung 0 (Trunkierung)
echo round($positive, mode: RoundingMode::TowardsZero) . PHP_EOL; // 2
echo round($negative, mode: RoundingMode::TowardsZero) . PHP_EOL; // -2
// Immer abrunden (floor)
echo round($positive, mode: RoundingMode::NegativeInfinity) . PHP_EOL; // 2
echo round($negative, mode: RoundingMode::NegativeInfinity) . PHP_EOL; // -3
// Immer aufrunden (ceil)
echo round($positive, mode: RoundingMode::PositiveInfinity) . PHP_EOL; // 3
echo round($negative, mode: RoundingMode::PositiveInfinity) . PHP_EOL; // -2
Verwendung mit bcround() für beliebige Präzision
<?php
// PHP 8.4+ mit bcmath
$value = '1.005';
// Klassisches Runden auf 2 Dezimalstellen
echo bcround($value, 2, RoundingMode::HalfAwayFromZero) . PHP_EOL; // 1.01
// Banker's Rounding
echo bcround($value, 2, RoundingMode::HalfEven) . PHP_EOL; // 1.00
// Wichtig · Fallstricke
Verfügbarkeit: RoundingMode ist erst ab PHP 8.4 verfügbar. In älteren PHP-Versionen müssen die Integer-Konstanten PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN und PHP_ROUND_HALF_ODD verwendet werden.
Finanzmathematik: Für Finanzanwendungen empfiehlt sich HalfEven (Banker's Rounding), da es systematische Rundungsfehler bei einer großen Anzahl von Operationen minimiert – im Gegensatz zum klassischen kaufmännischen Runden (HalfAwayFromZero), das leicht zugunsten größerer Werte tendiert.
Gleitkomma-Präzision: Bei Berechnungen mit float-Werten können binäre Gleitkommadarstellungen zu unerwarteten Ergebnissen führen. Für hohe Präzision sollte bcround() aus der BCMath-Erweiterung zusammen mit RoundingMode verwendet werden.