Mailinglisten-Archive |
Oliver Michalak wrote: > > Das finde ich schon dramatisch: > > obwohl die interne float-Repräsentation dafür ausreichen sollte, rundet > php bei folgender Berechnung falsch: > auf 15 soll 6.9 addiert werden, heraus kommt 21.8999999 (und ca. ab der > 12 Nachkommastelle stehen dann wirre 475 und dergleichen). Ist dies ein > bekanntes und mit vertretbaren Mitteln abfangbares Phänomen? Ich wollte > eigentlich für einen Minishop nicht auf die Zusatzmodule zur Erweiterung > auf eine beliebige Präzision wechseln... (btw. php 4.06 auf Linux und > MacOS-X gleichermaßen). Speziell für Währungs-Werte bietet es sich an, intern mit Pfennigen bzw. Cent statt DM oder Euro zu rechnen, dann spart man sich das Runden und muß nur bei der Ausgabe das Komma entsprechend setzen. Grundsätzlich ist das Problem, das Computer intern halt nicht im Dezimal- sondern im Dual-System rechnen und Ergebnisse ablegen, und das auch nur mit endlicher Stellenzahl. Und genauso wie es im Dezimalsystem Werte wie z.B. 1/3 gibt, die sich nicht mit endlich vielen Stellen darstellen lassen, trift das auch auf das Dualsystem zu, nur leider für andere Werte. Insbesondere ist 1/10 im Dualsystem ein Wert mit unendlich vielen Nachkommastellen. So kommt es bei der Darstellung von Fließkommawerten mit Nachkommastellen bei der Umwandlung zw. Dual- und Dezimalsystem (in beiden Richtungen) fast immer zu Rundungsfehlern an den letzten Stellen, die man i.A. durch eine entsprechende Rundung bei der Ausgabe explizit durch round() oder implizit durch die precision= Einstellung in php.ini ausgleicht (wen interessieren schon 14 Nachkommastellen?) -- Hartmut Holzgraefe hartmut_(at)_six.de http://www.six.de +49-711-99091-77
php::bar PHP Wiki - Listenarchive