Signatur
Beschreibung
bcmod gehört zur BCMath-Erweiterung (Binary Calculator) und ermöglicht die Modulo-Berechnung für beliebig große oder beliebig präzise Dezimalzahlen, die der native PHP-Integer-Typ nicht mehr korrekt verarbeiten könnte. Die Zahlen werden als Strings übergeben, sodass keine Präzisionsverluste durch Fließkomma-Arithmetik entstehen.
Das Vorzeichen des Ergebnisses entspricht dem Vorzeichen des Dividenden ($num1), analog zum Verhalten des %-Operators in PHP. Seit PHP 7.2 unterstützt bcmod auch Dezimalzahlen (also nicht-ganzzahlige Werte), während frühere Versionen nur auf ganzzahligen Anteil arbeiteten.
Der optionale Parameter $scale legt die Anzahl der Nachkommastellen im Ergebnis fest. Wird er weggelassen, gilt die mit bcscale() global gesetzte Genauigkeit oder 0 als Standardwert.
Typische Einsatzgebiete sind kryptografische Berechnungen, Prüfziffernalgorithmen (z. B. IBAN-Validierung) sowie überall dort, wo sehr große Ganzzahlen modulo einer anderen Zahl berechnet werden müssen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num1 Pflicht | string | Der Dividend – eine beliebig große Zahl als String (z. B. "123456789012345678901234567890"). |
|
| $num2 Pflicht | string | Der Divisor – eine beliebig große Zahl als String. Darf nicht "0" sein, da sonst ein DivisionByZeroError ausgelöst wird. |
|
| $scale | int|null | null | Anzahl der Dezimalstellen im Ergebnis. Wird null übergeben, gilt der globale BCMath-Scale (Standard: 0). |
Rückgabewert
$num1 durch $num2 als String zurück. Das Vorzeichen des Ergebnisses entspricht dem Vorzeichen von $num1. Seit PHP 8.0 wird bei Division durch null ein DivisionByZeroError geworfen (frühere Versionen gaben false zurück oder zeigten ein Warning).Beispiele
Einfache Modulo-Berechnung mit großen Ganzzahlen
<?php
// Sehr große Zahlen, die den nativen int-Typ überschreiten
$dividend = '123456789012345678901234567890';
$divisor = '9876543210';
$rest = bcmod($dividend, $divisor);
echo $rest; // Ergebnis: Rest der Division
IBAN-Validierung mit bcmod
<?php
// Vereinfachte IBAN-Prüfung: Numerische IBAN mod 97 muss 1 ergeben
function validateIban(string $iban): bool {
// Erste 4 Zeichen ans Ende verschieben
$rearranged = substr($iban, 4) . substr($iban, 0, 4);
// Buchstaben durch Zahlen ersetzen (A=10, B=11, ...)
$numeric = '';
foreach (str_split($rearranged) as $char) {
if (ctype_alpha($char)) {
$numeric .= (string)(ord(strtoupper($char)) - 55);
} else {
$numeric .= $char;
}
}
return bcmod($numeric, '97') === '1';
}
$iban = 'DE89370400440532013000';
echo validateIban($iban) ? 'IBAN gültig' : 'IBAN ungültig';
Modulo mit negativem Dividenden
<?php
// Das Vorzeichen des Ergebnisses folgt dem Vorzeichen des Dividenden
echo bcmod('-7', '3'); // -1
echo PHP_EOL;
echo bcmod('7', '-3'); // 1
Dezimalzahlen (ab PHP 7.2)
<?php
// Seit PHP 7.2 sind Dezimalzahlen als Operanden erlaubt
$result = bcmod('10.5', '3.2', 2);
echo $result;
// Wichtig · Fallstricke
Division durch null: Wird "0" als Divisor übergeben, wirft PHP ab Version 8.0 einen DivisionByZeroError. In älteren Versionen wurde false zurückgegeben und eine Warnung ausgegeben – prüfe daher den Divisor vor dem Aufruf.
Dezimalunterstützung: Vor PHP 7.2 ignorierte bcmod Nachkommastellen und arbeitete nur mit dem ganzzahligen Anteil. Achte darauf, wenn du Code für ältere PHP-Versionen schreibst oder pflegst.
BCMath-Extension: Die Erweiterung muss installiert bzw. aktiviert sein. Auf den meisten Systemen ist sie standardmäßig vorhanden, kann aber in minimalen PHP-Builds fehlen. Prüfe mit extension_loaded('bcmath').