Start · Sprachen · PHP · Referenz · RoundingMode

RoundingMode

Enum

Definiert Rundungsmodi für mathematische Operationen wie <code>round()</code> und <code>bcround()</code>.

seit PHP 8.4.0 Kategorie: math

Signatur

enum RoundingMode

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_UP fü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)
3 2 2 3 4 3

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
3 -3 2 -2 2 -3 3 -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
1.01 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.