Ingo Turski: Float-Zahl kürzen (74,34324148823 ==> 74,34)

Beitrag lesen

Hi,

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

Werde ich nachher tun.

danke schön - gespeichert für später.

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().

stimmt auch wieder.

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

Am Ende der Berechnung habe ich dieses Problem aber doch noch, da das Wohngeld nach der vom Gesetzgeber geforderten kaufmännischen Rundung ("ist auf den nächsten vollen Euro-Betrag aufzurunden, wenn der sich ohne Rundung ergebende restliche Cent-Betrag größer oder gleich 50 ist [...], abzurunden, wenn [...] kleiner als 50 ist.") im Sinne von round-half-up zu runden ist. Und wenn das Ergebnis als floatval ungünstig dargestellt wird, kommt es hier zum besagten Fehler.

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

Danke für den Tipp; das habe ich jetzt gemacht und auch die Rundung im letzten Schritt läuft damit wohl korrekt. Testweise ergibt round(floatval(bcmul('1.255','100'))) jedenfalls 126 und nicht wie bei round(1.255*100) 125.

Übrigens ist bcmath bzw. PHP in einer Beziehung ziemlich blöd:
Ich hatte die Tabellenwerte wie im Gesetz angegeben im Format z.B. 9.102E-5 eingetragen. Diese Notation über strval(9.102E-5) zu "9.102E-005" konvertiert, betrachtet bcmath allerdings als 0. Also musste ich die ganzen Werte erst in das Format z.B. '0.00009102' ändern. :-(

freundliche Grüße
Ingo