PHP WTF #3

Und ein neuer WTF-Teil (Teil 1, Teil 2)!

var_dump(1/3 + 4/3 == 5/3);

Ergebnis? false natürlich! Wie auch sonst, wär ja anderenfalls kein WTF. Genaugenommen hat das „Phänomen“ nichts mit PHP zu tun sondern mit Floating Point-Berechnungen und deren Präzision. Trotz allem hat mich der Spaß gerade eine Viertelstunde Debugging-Zeit gekostet, und zwar in C++. Deswegen mal kurz in PHP getestet – mit gleichem Ergebnis.

Und noch einer:

var_dump(19.99 + 19.99 == 49.98); //bool(false)

Richtigstellung: Schande über mein Haupt und danke an Enrico (siehe Kommentar). Grober Rechenfehler meinerseits. Das Ergebnis lautet natürlich nicht 49.98, sondern 39.98, was dann auch zu einem bool(true) führt.

Wer in die harte Theorie dahinter einsteigen will oder Uni-Wissen auffrischen möchte, ist hier ganz gut aufgehoben.

Weitere Posts:

Dieser Beitrag wurde unter php, PHP-WTF, Quicktips, webdev veröffentlicht. Setze ein Lesezeichen auf den Permalink.

3 Antworten auf PHP WTF #3

  1. Enrico sagt:

    Hi dein 2. Beispiel stimmt nicht denn 19,99 + 19,99 ist 39,98 und var_dump gibt dann auch bool(true) aus.
    Ich danke dir für die nette PHP WTF Reihe ich hoffe es kommt bald noch mehr davon. ;)

    1. david sagt:

      phew. Das ist jetzt leicht peinlich, habe es soeben korrigiert ;). Danke dir!

  2. Michi sagt:

    Beim ersten Beispiel sollte man vielleicht noch ergänzen, dass in einigen Sprachen zwar „true“ rauskommt aber aus falschen Gründen. Oft wird bei int/int eine Ganzzahl Division durchgeführt
    somit wird aus
    1/3 + 4/3 == 5/3
    0 + 1 == 1
    Zur Sicherheit sollte man da 1/3.0 schreiben um wirklich Floats zu erzwingen und dann haut die von dir erwähnte Ungenauigkeit zu, weswegen man Floats/Doubles immer mit einem Epsilon vergleichen sollte.
    if(abs(1/3.0 + 4/3.0 - 5/3.0) < EPSILON)

Schreibe einen Kommentar zu Enrico Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert