Signatur
Beschreibung
bccomp gehört zur BCMath-Erweiterung (Binary Calculator) und vergleicht zwei Zahlen, die als Zeichenketten übergeben werden. Damit lassen sich sehr große oder sehr präzise Dezimalzahlen korrekt vergleichen, bei denen normale Gleitkomma-Vergleiche (==, <, >) aufgrund von Rundungsfehlern fehlerhafte Ergebnisse liefern würden.
Der Parameter scale bestimmt, wie viele Nachkommastellen beim Vergleich berücksichtigt werden. Wird er weggelassen, gilt der global via bcscale() eingestellte Wert (Standard: 0). Ein höherer scale-Wert erhöht die Präzision des Vergleichs.
Typische Einsatzgebiete sind Finanzsoftware (Währungsbeträge, Preisvergleiche), kryptografische Berechnungen sowie alle Szenarien, in denen mit sehr langen Integer- oder Dezimalzahlen gearbeitet wird, die den Wertebereich von int oder float überschreiten.
Der Rückgabewert folgt der üblichen Konvention für Vergleichsfunktionen: -1 wenn num1 kleiner ist, 0 bei Gleichheit und 1 wenn num1 größer ist. Ab PHP 8.0 ist scale nullable und darf null sein.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num1 Pflicht | string | Die erste Zahl als Zeichenkette (z. B. '12345678901234567890'). Muss eine gültige BCMath-Zahl sein. |
|
| $num2 Pflicht | string | Die zweite Zahl als Zeichenkette, mit der num1 verglichen wird. |
|
| $scale | ?int | null | Anzahl der Nachkommastellen, die beim Vergleich berücksichtigt werden. null oder Weglassen verwendet den mit bcscale() gesetzten Globalwert (Standard 0). |
Rückgabewert
-1 zurück, wenn num1 kleiner als num2 ist, 0 wenn beide gleich sind, und 1 wenn num1 größer als num2 ist.Beispiele
Einfacher Vergleich großer Ganzzahlen
<?php
$a = '99999999999999999999';
$b = '100000000000000000000';
$result = bccomp($a, $b);
if ($result === -1) {
echo "a ist kleiner als b";
} elseif ($result === 0) {
echo "a und b sind gleich";
} else {
echo "a ist größer als b";
}
Dezimalvergleich mit definierter Skalierung (Finanzbetrag)
<?php
// Preise mit 4 Nachkommastellen vergleichen
$preis1 = '19.9999';
$preis2 = '20.0000';
$vergleich = bccomp($preis1, $preis2, 4);
switch ($vergleich) {
case -1:
echo "Preis 1 ist günstiger.";
break;
case 0:
echo "Beide Preise sind gleich.";
break;
case 1:
echo "Preis 1 ist teurer.";
break;
}
Verwendung in usort() zum Sortieren großer Zahlen
<?php
$zahlen = [
'9999999999999999999',
'1000000000000000000',
'5555555555555555555',
];
usort($zahlen, 'bccomp');
foreach ($zahlen as $z) {
echo $z . PHP_EOL;
}
// Wichtig · Fallstricke
Skalierungsfalle: Wird scale auf 0 gesetzt (oder ist der Globalwert 0), werden Nachkommastellen abgeschnitten, nicht gerundet. bccomp('1.9', '1.1', 0) ergibt daher 0, da beide Werte auf 1 gekürzt werden.
Ungültige Eingaben: Übergabe nicht-numerischer Zeichenketten führt seit PHP 8.0 zu einem ValueError. In älteren Versionen wurde der Wert stillschweigend als 0 interpretiert.
BCMath-Verfügbarkeit: Die Erweiterung muss beim PHP-Build aktiviert sein (via --enable-bcmath). Bei modernen Distributionen und Hosting-Anbietern ist sie meist standardmäßig verfügbar.