Start · Sprachen · PHP · Referenz · bcdivmod

bcdivmod

Funktion

Teilt zwei beliebig genaue Zahlen und liefert gleichzeitig Quotient und Rest (Modulo) als Array zurück.

seit PHP 8.4.0 Kategorie: math

Signatur

bcdivmod(string $num1, string $num2, int $scale = 0): array

Beschreibung

bcdivmod() ist Teil der BCMath-Erweiterung für beliebig genaue Arithmetik. Die Funktion kombiniert die Operationen von bcdiv() und bcmod() in einem einzigen Aufruf und gibt das Ergebnis als indiziertes Array zurück, wobei Index 0 den Quotienten und Index 1 den Rest enthält.

Der Parameter scale legt die Anzahl der Dezimalstellen fest, auf die der Quotient gerundet wird. Der Rest wird immer als ganzzahliger Wert zurückgegeben (ohne Nachkommastellen). Diese Funktion ist besonders nützlich, wenn beide Werte – Division und Modulo – gleichzeitig benötigt werden, ohne zwei separate BCMath-Aufrufe durchführen zu müssen.

Typische Einsatzgebiete sind Finanzberechnungen, kryptografische Algorithmen, Zahlentheorie (z. B. Euklidischer Algorithmus) sowie überall dort, wo mit sehr großen Ganzzahlen oder Zahlen mit vielen Nachkommastellen gerechnet wird, die die native Präzision von PHP-Float-Werten überschreiten.

Wichtig: Beide Eingabeparameter müssen als Strings übergeben werden, die gültige numerische Werte repräsentieren. num2 darf nicht 0 sein, da dies zu einer DivisionByZeroError-Ausnahme führt.

Parameter

Name Typ Default Beschreibung
$num1 Pflicht string Der Dividend – die zu teilende Zahl als numerischer String beliebiger Größe.
$num2 Pflicht string Der Divisor als numerischer String. Darf nicht 0 sein, da sonst eine DivisionByZeroError-Ausnahme geworfen wird.
$scale int 0 Anzahl der Dezimalstellen im zurückgegebenen Quotienten. Der Rest (Index 1) hat immer keine Nachkommastellen. Standard: 0.

Rückgabewert

Typ
array
Beschreibung
Gibt ein indiziertes Array mit zwei Elementen zurück: [0] enthält den Quotienten (als String mit der angegebenen Skalierung), [1] enthält den Rest der Division (als ganzzahliger String).

Beispiele

Einfache Division mit Quotient und Rest

<?php
$result = bcdivmod('17', '5');

echo 'Quotient: ' . $result[0] . PHP_EOL;
echo 'Rest:     ' . $result[1] . PHP_EOL;
// Entspricht: 17 / 5 = 3 Rest 2
Quotient: 3 Rest: 2

Division mit Dezimalstellen im Quotienten

<?php
// Quotient auf 4 Nachkommastellen, Rest bleibt ganzzahlig
$result = bcdivmod('100', '7', 4);

echo 'Quotient: ' . $result[0] . PHP_EOL;
echo 'Rest:     ' . $result[1] . PHP_EOL;
Quotient: 14.2857 Rest: 2

Euklidischer Algorithmus mit sehr großen Zahlen

<?php
// Größten gemeinsamen Teiler (ggT) per Euklidischem Algorithmus
function ggT(string $a, string $b): string {
    while (bccomp($b, '0') !== 0) {
        [, $rest] = bcdivmod($a, $b);
        $a = $b;
        $b = $rest;
    }
    return $a;
}

$a = '123456789012345678901234567890';
$b = '987654321098765432109876543210';

echo 'ggT: ' . ggT($a, $b) . PHP_EOL;
ggT: 900000000090000000009

// Wichtig · Fallstricke

Verfügbarkeit: bcdivmod() wurde in PHP 8.4.0 eingeführt. In älteren Versionen müssen bcdiv() und bcmod() separat aufgerufen werden.

Division durch null: Wird '0' als Divisor übergeben, wirft die Funktion einen DivisionByZeroError. Der Divisor sollte daher immer vorab geprüft werden.

Negative Zahlen: Das Vorzeichen des Rests entspricht dem Vorzeichen des Dividenden (konsistent mit bcmod()). Bei negativen Eingaben sollte das erwartete Verhalten sorgfältig überprüft werden.

Skalierung: Der scale-Parameter beeinflusst nur den Quotienten. Der Rest ist stets ein ganzzahliger String, unabhängig von scale.