Start · Sprachen · PHP · Referenz · bccomp

bccomp

Funktion

Vergleicht zwei Zahlen beliebiger Genauigkeit und gibt -1, 0 oder 1 zurück.

seit PHP 4.0.0 Kategorie: math

Signatur

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

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

Typ
int
Beschreibung
Gibt -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";
}
a ist kleiner 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;
}
Preis 1 ist günstiger.

Verwendung in usort() zum Sortieren großer Zahlen

<?php
$zahlen = [
    '9999999999999999999',
    '1000000000000000000',
    '5555555555555555555',
];

usort($zahlen, 'bccomp');

foreach ($zahlen as $z) {
    echo $z . PHP_EOL;
}
1000000000000000000 5555555555555555555 9999999999999999999

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