Start · Sprachen · PHP · Referenz · bcfloor

bcfloor

Funktion

Rundet eine beliebig genaue Dezimalzahl auf die nächst kleinere ganze Zahl ab und gibt das Ergebnis als String zurück.

seit PHP 8.4.0 Kategorie: math

Signatur

bcfloor(string $num): string

Beschreibung

bcfloor() ist Teil der BCMath-Erweiterung für beliebig genaue Arithmetik und ermittelt den größten ganzzahligen Wert, der kleiner oder gleich der übergebenen Zahl ist – analog zur PHP-Funktion floor(), jedoch ohne die Präzisionsverluste, die beim Umgang mit Gleitkommazahlen (float) auftreten können.

Die Funktion erwartet die Zahl als string, was die Verarbeitung sehr großer oder sehr kleiner Dezimalzahlen ermöglicht, die mit nativen PHP-Floats nicht korrekt dargestellt werden könnten. Das Ergebnis wird ebenfalls als string zurückgegeben und enthält keine Nachkommastellen.

Typische Einsatzgebiete sind Finanzberechnungen, Kryptowährungsanwendungen oder wissenschaftliche Berechnungen, bei denen exakte Dezimalgenauigkeit unabdingbar ist und eine Abrundung auf den ganzzahligen Teil benötigt wird.

Negative Zahlen werden korrekt behandelt: bcfloor('-1.3') liefert '-2', da –2 die nächstkleinere ganze Zahl gegenüber –1,3 ist.

Parameter

Name Typ Default Beschreibung
$num Pflicht string Die abzurundende Zahl als Zeichenkette in dezimaler Darstellung, z. B. '3.7' oder '-2.1'. Ungültige Zeichen im String führen zu einem ValueError.

Rückgabewert

Typ
string
Beschreibung
Den abgerundeten ganzzahligen Wert als string ohne Nachkommastellen. Für negative Zahlen wird in Richtung negativer Unendlichkeit gerundet.

Beispiele

Einfaches Abrunden positiver und negativer Zahlen

<?php
// Positive Dezimalzahl
echo bcfloor('4.9');  // Gibt '4' aus
echo "\n";

// Negative Dezimalzahl
echo bcfloor('-1.3'); // Gibt '-2' aus
echo "\n";

// Bereits ganzzahliger Wert
echo bcfloor('7.0');  // Gibt '7' aus
4 -2 7

Finanzberechnung mit sehr langer Dezimalzahl

<?php
// Berechnung eines Rabatts ohne Float-Präzisionsfehler
$preis       = '199.9999999999999';
$rabatt      = '0.1234567890123456';
$nettoBetrag = bcsub($preis, $rabatt, 20);

echo 'Nettobetrag:    ' . $nettoBetrag . "\n";
echo 'Abgerundet:     ' . bcfloor($nettoBetrag) . "\n";

// Vergleich mit float-basiertem floor() – zeigt mögliche Abweichungen
$floatBetrag = (float)$preis - (float)$rabatt;
echo 'floor() float:  ' . floor($floatBetrag) . "\n";
Nettobetrag: 199.87654321098765550000 Abgerundet: 199 floor() float: 199

// Wichtig · Fallstricke

Voraussetzung: Die BCMath-Erweiterung muss kompiliert oder als Shared Extension geladen sein (extension=bcmath). Ab PHP 8.4.0 ist bcfloor() verfügbar.

Eingabevalidierung: Ungültige Strings (z. B. 'abc') lösen seit PHP 8.x einen ValueError aus. Vor dem Aufruf sollte die Eingabe daher validiert werden, insbesondere wenn sie aus Nutzereingaben stammt.

Rückgabeformat: Der zurückgegebene String enthält keine Nachkommastellen und kein .0-Suffix. Soll das Ergebnis für weitere BCMath-Operationen genutzt werden, ist das kein Problem; für Ausgaben kann eine explizite Formatierung sinnvoll sein.