Signatur
Beschreibung
bcdiv() gehört zur BCMath-Erweiterung und ermöglicht die Division von Zahlen mit beliebiger Genauigkeit, ohne auf die Float-Darstellung des Prozessors angewiesen zu sein. Dies ist besonders wichtig bei Finanzberechnungen, kryptographischen Algorithmen oder überall dort, wo Rundungsfehler durch binäre Gleitkommazahlen nicht tolerierbar sind.
Der Parameter scale bestimmt die Anzahl der Dezimalstellen im Ergebnis. Wird er weggelassen, greift der global gesetzte Wert aus bcscale(); ist dieser ebenfalls nicht gesetzt, wird 0 verwendet, d. h. das Ergebnis wird auf eine ganze Zahl abgeschnitten (nicht gerundet).
Beide Operanden werden als Zeichenketten übergeben, was die Darstellung beliebig großer Zahlen erlaubt, die weit über den Wertebereich von int oder float hinausgehen. Ungültige Zeichen in den Zeichenketten werden stillschweigend als 0 interpretiert.
Seit PHP 8.0 löst bcdiv() eine DivisionByZeroError-Ausnahme aus, wenn der Divisor 0 ist. In früheren PHP-Versionen wurde in diesem Fall null zurückgegeben.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num1 Pflicht | string | Der Dividend als Zeichenkette (z. B. '10.5'). |
|
| $num2 Pflicht | string | Der Divisor als Zeichenkette. Darf nicht '0' sein, da sonst ein DivisionByZeroError geworfen wird. |
|
| $scale | ?int | null | Anzahl der Dezimalstellen im Ergebnis. Wird null übergeben, gilt der globale Wert aus bcscale() oder 0. |
Rückgabewert
Beispiele
Einfache Division mit definierter Genauigkeit
<?php
// Division mit 4 Dezimalstellen
$ergebnis = bcdiv('10', '3', 4);
echo $ergebnis; // 3.3333
// Ohne scale-Angabe: Ganzzahl-Ergebnis
$ganzzahl = bcdiv('10', '3');
echo $ganzzahl; // 3
Finanzberechnung: Aufteilung eines Betrags
<?php
// Preis aufteilen auf 3 Personen (z. B. Rechnungsbetrag)
$gesamtbetrag = '149.99';
$personen = '3';
$anteil = bcdiv($gesamtbetrag, $personen, 2);
echo 'Jeder zahlt: ' . $anteil . ' EUR'; // 49.99
Division durch null abfangen (PHP 8+)
<?php
try {
$ergebnis = bcdiv('100', '0', 2);
} catch (\DivisionByZeroError $e) {
echo 'Fehler: ' . $e->getMessage();
}
// Wichtig · Fallstricke
Abschneiden statt Runden: bcdiv() schneidet das Ergebnis auf die angegebene Anzahl von Dezimalstellen ab, anstatt zu runden. bcdiv('10', '3', 2) ergibt '3.33' und nicht '3.34'. Falls Runden erforderlich ist, muss dies manuell implementiert werden, z. B. durch Addition von 0.5 * 10^(-scale) vor der Division.
Ungültige Eingaben: Zeichenketten mit ungültigen Zeichen (z. B. 'abc') werden als 0 interpretiert, was zu unerwarteten Ergebnissen oder einer DivisionByZeroError-Ausnahme führen kann. Eingaben sollten daher immer validiert werden.
BCMath muss aktiviert sein: Die Erweiterung ist in den meisten PHP-Distributionen standardmäßig enthalten, kann aber in minimalen Builds fehlen. Prüfe ggf. mit extension_loaded('bcmath').