Signatur
Beschreibung
bcmul() gehört zur BCMath-Erweiterung (Binary Calculator) und ermöglicht die Multiplikation von Zahlen mit beliebig vielen Stellen und Dezimalstellen, ohne auf die Genauigkeitsgrenzen von PHP-float-Werten zu stoßen. Dies ist besonders wichtig bei Finanzberechnungen, Kryptographie oder überall dort, wo Fließkommafehler nicht toleriert werden können.
Beide Operanden werden als string übergeben. Der Parameter scale legt die Anzahl der Dezimalstellen im Ergebnis fest. Wird scale nicht angegeben oder auf null gesetzt, gilt der global konfigurierte Wert aus bcscale() bzw. der INI-Einstellung bcmath.scale (Standard: 0).
Im Gegensatz zur nativen PHP-Multiplikation (*) entstehen bei bcmul() keine Rundungsfehler durch IEEE-754-Fließkommadarstellung. Selbst Zahlen mit Hunderten von Stellen werden exakt verarbeitet.
Die Funktion setzt eine korrekte Dezimaldarstellung voraus (Punkt als Dezimaltrenner). Ungültige Zeichen in den Strings werden als 0 interpretiert, was zu stillen Fehlern führen kann – Eingaben sollten daher vorher validiert werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num1 Pflicht | string | Der erste Multiplikand als dezimaler Zahlen-String (z. B. '3.14' oder '999999999999999'). |
|
| $num2 Pflicht | string | Der zweite Multiplikand als dezimaler Zahlen-String. | |
| $scale | int|null | null | Anzahl der Dezimalstellen im Ergebnis. Bei null wird der globale BCMath-Skalierungswert verwendet (Standard: 0, also ganzzahliges Ergebnis). |
Rückgabewert
scale z. B. 2, enthält das Ergebnis immer genau zwei Nachkommastellen.Beispiele
Einfache Multiplikation ganzer Zahlen
<?php
$result = bcmul('123456789', '987654321');
echo $result; // Kein Dezimalanteil, scale = 0
Preisberechnung mit Dezimalstellen (Finanzanwendung)
<?php
// Bruttopreis = Nettopreis * MwSt-Faktor
$nettopreis = '49.99';
$mwstFaktor = '1.19';
$bruttopreis = bcmul($nettopreis, $mwstFaktor, 2);
echo 'Bruttopreis: ' . $bruttopreis . ' EUR';
Vergleich: float vs. bcmul bei Genauigkeitsproblemen
<?php
// Fließkomma-Ungenauigkeit
$floatResult = 0.1 * 0.7;
echo 'float: ' . $floatResult . PHP_EOL; // Gibt einen leicht abweichenden Wert aus
// Exaktes Ergebnis mit bcmul
$bcResult = bcmul('0.1', '0.7', 10);
echo 'bcmul: ' . $bcResult . PHP_EOL;
// Wichtig · Fallstricke
Stille Fehler bei ungültigen Strings: Enthält ein Eingabe-String nicht-numerische Zeichen (z. B. Leerzeichen, Währungssymbole), interpretiert BCMath den String als 0 – es wird keine Exception geworfen. Seit PHP 8.0 wird in solchen Fällen ein ValueError ausgelöst, was die Fehlersuche erleichtert.
Dezimaltrenner: Als Dezimaltrenner wird ausschließlich der Punkt (.) akzeptiert. Ein Komma führt zu falschen Ergebnissen oder einem Fehler.
Negative Skalierung: Ein negativer scale-Wert ist seit PHP 8.0 nicht mehr erlaubt und wirft einen ValueError.
Performance: Für sehr große Zahlen mit vielen Stellen ist bcmul() langsamer als natives Float-Rechnen – der Genauigkeitsgewinn erkauft sich durch höheren Rechenaufwand.