Christian Seiler: Float-Zahl kürzen (74,34324148823 ==> 74,34)

Beitrag lesen

Hallo Ingo,

Könntest Du diesen Code auch mal in PHP posten?

Werde ich nachher tun.

Den würde ich dann nämlich gern in meinen neuen Wohngeldrechner übernehmen. Zwar erfüllt mein PHP-Script leider nicht die gesetzliche Forderung, dass Dezimalzahlen als Festkommazahlen mit zehn Nachkommastellen zu berücksichtigen sind, aber die Rundung sollte wenigstens stimmen.
Bislang runde ich z.B. das Einkommen so:
$Y = floor(($Monatseinkommen+9.99)/10)*10 -5;
um die Vorgabe "Um „Y“ zu erhalten, ist „Y“ auf den nächsten durch 10 ohne Rest teilbaren vollen Euro-Betrag aufzurunden [... und hiervon] 5 Euro abzuziehen" zu erfüllen.

Naja, für diese Logik bräuchtest grundsätzlich einfach nur ein ceil($Monatseinkommen / 10) * 10 - 5; - das klappt auch in bisherigen PHP-Versionen gut [*]. Außerdem würde Dir mein round() nichts nützen, weil das ja zur nächsten Zahl rundet und nicht explizit auf/abrundet - dazu braucht man weiterhin floor() / ceil(). Die zwei Probleme, weswegen mein round() die ganze Rechnung komplizierter macht, decken folgende Fälle ab:

* Auf sehr hohe/niedrige Nachkommastellenzahl runden (< -22 / > +22), vgl.
   z.B. round(1e24, -24) == 1e24 oder round(1e-24, 24) == 1e-24)
   Ist aber bei Dir nicht der Fall, Du rundest ja auf -1 Stellen
   Genauigkeit.
 * Bei Rundung auf Genauigkeit *hinter* dem Komma (d.h. auf mind. 1
   Nachkommastelle). Du willst aber auf Genauigket *vor* dem Komma runden,
   d.h. da tritt das Problem nicht auf.

Wenn Du Festkommazahlen willst, kannst Du übrigens auch die bcmath-Erweiterung verwenden...

Viele Grüße,
Christian

[*] Bis auf die FPU-Präzisions-Geschichte, die man in JS aber nie vermeiden kann (da ist man den jew. Browserimplementierungen ausgeliefert) und in reinem PHP auch nicht.