Christian Seiler: falscher days-Wert bei DateTime::diff

Beitrag lesen

Hallo,

gräm dich nicht, es ist halt PHP:

print_r((int) (19.99 * 100));

  
Es mag ja viel an PHP zu kritisieren geben aber \*das\* ist nicht die Schuld von PHP. Das ist nämlich laut IEEE 754 Double-Arithmetik das korrekte Ergebnis.  
  
Beispiel Python:  
  
print int(19.99\*100)  
  
Beispiel Perl:  
  
print int(19.99\*100);  
  
Beispiel C:  
  
printf ("%d\n", (int)(19.99\*100));  
  
Beispiel Haskell:  
  
truncate (19.99\*100)  
  
Beispiel Ruby:  
  
print Integer(19.99\*100)  
  
Beispiel Javascript:  
  
alert(parseInt(19.99\*100));  
  
Hintergrund ist der: 19.99 kann nicht exakt dargestellt werden in Double-Arithmetik, der IEEE 754-Standard schreibt vor, dass man in solchen Fällen die nächstmögliche Zahl nehmen soll. Das ist in dem Fall:  
  
19\.989999999999998436805981327779591083526611328125  
  
Wenn man die im Computer mit 100 multipliziert, ist das Ergebnis:  
  
1998\.999999999999772626324556767940521240234375  
  
(Die Multiplikation kann auch wieder nicht exakt durchgeführt werden, da die Genauigkeit wieder nicht ausreicht.)  
  
Wenn man diese Zahl nun in einen Integer verwandelt, werden eben alle Nachkommastellen abgeschnitten und dann bleibt nur 1998 übrig. Egal in welcher Sprache, solange sie IEEE 754 Arithmetik benutzt.  
  
Wenn Du dagegen eine andere Sprache verwendest, die z.B. beliebig genaue Dezimalarithmetik implementiert (was \*SEHR\* viel langsamer wäre, weil das Prozessoren nicht von Haus aus können im Gegensatz zu IEEE 754), dann würdest Du natürlich das aus Deiner Sicht "korrekte" Ergebnis bekommen. Solche Arithmetik gibt's für viele bestehende Sprachen als Zusatzmodule, für PHP z.B. via die bcmath-Erweiterung.  
  
Viele Grüße,  
Christian  

-- 
[Mein "Weblog"](http://del.icio.us/chris_se/servertipps) [[RSS](http://del.icio.us/rss/chris_se/servertipps)]  
[Using XSLT to create JSON output](http://www.christian-seiler.de/projekte/xslt-json/) (Saxon-B 9.0 for Java)  
  
»I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«  
            -- [Kommentar bei TDWTF](http://thedailywtf.com/Comments/WellIntentioned-Destruction.aspx#254549)