Start · Sprachen · PHP · Referenz · bcdiv

bcdiv

Funktion

Dividiert zwei Zahlen beliebiger Genauigkeit und gibt das Ergebnis als Zeichenkette zurück.

seit PHP 4.0.0 Kategorie: math

Signatur

bcdiv(string $num1, string $num2, ?int $scale = null): string

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

Typ
string
Beschreibung
Das Ergebnis der Division als Zeichenkette mit der angegebenen Anzahl von Dezimalstellen. Überschüssige Nachkommastellen werden abgeschnitten (nicht gerundet).

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
3.3333 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
Jeder zahlt: 49.99 EUR

Division durch null abfangen (PHP 8+)

<?php
try {
    $ergebnis = bcdiv('100', '0', 2);
} catch (\DivisionByZeroError $e) {
    echo 'Fehler: ' . $e->getMessage();
}
Fehler: Division by zero

// 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').