Start · Sprachen · PHP · Referenz · bcmul

bcmul

Funktion

Multipliziert zwei Zahlen beliebiger Genauigkeit und gibt das Ergebnis als String zurück.

seit PHP 4.0.0 Kategorie: math

Signatur

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

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

Typ
string
Beschreibung
Das Produkt beider Zahlen als String mit der angegebenen Anzahl von Dezimalstellen. Ist 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
121932631112635269

Preisberechnung mit Dezimalstellen (Finanzanwendung)

<?php
// Bruttopreis = Nettopreis * MwSt-Faktor
$nettopreis  = '49.99';
$mwstFaktor  = '1.19';
$bruttopreis = bcmul($nettopreis, $mwstFaktor, 2);
echo 'Bruttopreis: ' . $bruttopreis . ' EUR';
Bruttopreis: 59.48 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;
float: 0.07000000000000001 bcmul: 0.0700000000

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