Start · Sprachen · PHP · Referenz · bcround

bcround

Funktion

Rundet eine beliebig genaue Dezimalzahl (als String) auf die angegebene Anzahl an Dezimalstellen mit konfigurierbarem Rundungsmodus.

seit PHP 8.4.0 Kategorie: math

Signatur

bcround(string $num, int $precision = 0, RoundingMode $mode = RoundingMode::HalfAwayFromZero): string

Beschreibung

bcround() ist Teil der BCMath-Erweiterung und ermöglicht das Runden von Zahlen mit beliebiger Präzision, die als Strings übergeben werden. Im Gegensatz zu round() verliert bcround() keine Genauigkeit durch Gleitkomma-Arithmetik, was es ideal für finanzielle Berechnungen, Buchhaltungssoftware oder wissenschaftliche Anwendungen macht, bei denen exakte Dezimalzahlen entscheidend sind.

Der Parameter precision gibt an, auf wie viele Nachkommastellen gerundet wird. Ein positiver Wert rundet auf Dezimalstellen, der Wert 0 rundet auf die nächste ganze Zahl. Negative Werte runden auf Zehnerstellen, Hunderterstellen usw.

Über den mode-Parameter (ein RoundingMode-Enum, eingeführt in PHP 8.4) kann das Rundungsverhalten präzise gesteuert werden – z. B. kaufmännisches Runden (HalfAwayFromZero), Banker's Rounding (HalfEven) oder immer in Richtung positiv/negativ Unendlich.

Die Funktion gibt das Ergebnis stets als String zurück, was die nahtlose Weiterverarbeitung mit anderen BCMath-Funktionen wie bcadd(), bcmul() usw. erlaubt.

Parameter

Name Typ Default Beschreibung
$num Pflicht string Die zu rundende Zahl als Dezimalstring, z. B. '3.14159' oder '-2.5'. Führende und nachfolgende Leerzeichen werden ignoriert.
$precision int 0 Anzahl der Dezimalstellen, auf die gerundet wird. Positive Werte runden auf Nachkommastellen, 0 auf ganze Zahlen, negative Werte auf Zehner, Hunderter usw.
$mode RoundingMode RoundingMode::HalfAwayFromZero Bestimmt das Rundungsverhalten bei einem Wert von genau der Hälfte. Mögliche Werte sind RoundingMode::HalfAwayFromZero (Standard, kaufmännisch), RoundingMode::HalfTowardsZero, RoundingMode::HalfEven (Banker's Rounding), RoundingMode::HalfOdd, RoundingMode::TowardsZero, RoundingMode::AwayFromZero, RoundingMode::NegativeInfinity und RoundingMode::PositiveInfinity.

Rückgabewert

Typ
string
Beschreibung
Die gerundete Zahl als Dezimalstring. Das Ergebnis wird ohne wissenschaftliche Notation zurückgegeben und kann direkt an andere BCMath-Funktionen übergeben werden.

Beispiele

Einfaches kaufmännisches Runden

<?php
// Standardmodus: HalfAwayFromZero (kaufmännisches Runden)
echo bcround('2.5', 0);   // 3
echo "\n";
echo bcround('2.45', 1);  // 2.5
echo "\n";
echo bcround('-2.5', 0);  // -3
echo "\n";
echo bcround('123456.789', 2); // 123456.79
3 2.5 -3 123456.79

Banker's Rounding (HalfEven) für Finanzbuchhaltung

<?php
// HalfEven rundet zur nächsten geraden Zahl – reduziert statistische Verzerrung
use RoundingMode;

$werte = ['0.5', '1.5', '2.5', '3.5', '4.5'];
foreach ($werte as $wert) {
    $ergebnis = bcround($wert, 0, RoundingMode::HalfEven);
    echo "bcround('$wert', 0, HalfEven) = $ergebnis\n";
}
bcround('0.5', 0, HalfEven) = 0 bcround('1.5', 0, HalfEven) = 2 bcround('2.5', 0, HalfEven) = 2 bcround('3.5', 0, HalfEven) = 4 bcround('4.5', 0, HalfEven) = 4

Negative Präzision – Runden auf Zehnerstellen

<?php
// Negative precision: Runden auf die nächste Zehnerstelle
echo bcround('1234.567', -2);  // 1200
echo "\n";
echo bcround('1250.00', -2);   // 1300
echo "\n";
echo bcround('9876.543', -3);  // 10000
1200 1300 10000

// Wichtig · Fallstricke

Voraussetzung: bcround() ist erst ab PHP 8.4.0 verfügbar. Für ältere PHP-Versionen muss das Runden manuell über eine Kombination aus bcadd(), bcmul() und bccomp() oder über round() (mit Genauigkeitsverlust) implementiert werden.

BCMath-Erweiterung: Die Funktion setzt die BCMath-Erweiterung voraus (ext-bcmath). Diese ist in den meisten PHP-Standardinstallationen aktiviert, kann aber in minimalen Builds fehlen.

Gleitkomma-Vergleich: Verwende nicht round() bei finanzkritischen Berechnungen – Gleitkommazahlen können intern ungenaue Werte wie 2.4999999999 statt 2.5 darstellen, was zu falschen Rundungsergebnissen führt. bcround() arbeitet rein dezimalbasiert und ist daher exakt.