Erk Struwe: Unglaubliches Float-Problem

Hallo!

Ich habe ein Problem, das ich mir beim besten Willen nicht erklären kann. Habe darüber auch nichts finden können. Vielleicht weiß jemand eine Lösung...

Ich erhalte bei folgendem Code folgende Ausgabe:

Code:
if ((19.9 * 100) % 10 == 0) {
 echo "foo";
}
if (1990 % 10 == 0) {
 echo "bar";
}
if ((21.9 * 100) % 10 == 0) {
 echo " Was ";
}
if (2190 % 10 == 0) {
 echo "geht ab?";
}

Ausgabe:
bar Was geht ab?

Das bedeutet, dass für meinen Server 1990 durch 10 ohne Rest teilbar ist, nicht aber 19.9 * 100 = 1990... Mit 20.9 geht es auch nicht, dafür aber mit 21.9...

Was ist da los? Ich falle gerade vom Glauben ab.

Danke für Eure Hilfe.

MfG,
Erk Struwe

  1. Hallo

    Das bedeutet, dass für meinen Server 1990 durch 10 ohne Rest teilbar ist,

    eine reine Integergeschichte, ist genau darstellbar.

    nicht aber 19.9 * 100 = 1990... Mit 20.9 geht es auch nicht, dafür aber mit 21.9...

    Normales Problem bei der Genauigkeit von Gleitpunktzahlen inklusive Rundung.

    Was ist da los? Ich falle gerade vom Glauben ab.

    dann wird es Zeit, den Irrglauben abzulegen und Dir Wissen anzueignen.
    Die Frage wurde hier schon häufig gestellt, z.B. in diesem Archivposting erklärt.

    Freundliche Grüße

    Vinzenz

  2. Hallo Erk,

    Das bedeutet, dass für meinen Server 1990 durch 10 ohne Rest teilbar ist, nicht aber 19.9 * 100 = 1990... Mit 20.9 geht es auch nicht, dafür aber mit 21.9...

    Was ist da los? Ich falle gerade vom Glauben ab.

    Führ mal folgendes aus:

    <?php  
        var_dump((int)(19.9 * 100));  
        var_dump(1990);  
    ?>
    

    Das Ergebnis überrascht dich? Wenn ja, solltest du dich mal genauer damit befassen, wie Fließkommazahlen gespeichert werden. Die Art der Speicherung bringt es mit sich, dass Fließkommazahlen nicht völlig genau sind: Floating Point Accuracy Problems aus der Wikipedia.

    Schöne Grüße,

    Johannes

  3. Hi!
    nicht unglaublich. Ganz normal. Hier mal ein kleines Javascript:
    <script type="text/javascript">

    for (i=1; i<=2; i+=0.1)
     {
      alert(i);
     }

    </script>

    Nimm keine floats. Zur Not rechne mit Integer.