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.