phpbar.de logo

Mailinglisten-Archive

[php] RechenUNgenauigkeit

[php] RechenUNgenauigkeit

Hartmut Holzgraefe php_(at)_phpcenter.de
Wed, 01 Aug 2001 09:30:23 +0200


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