FrankS: Wer ist hier blöd? Rechenfehler bei normaler Addition?

Hallo allemiteinander!

Kann ich nicht rechnen oder hat JavaScript ein Problem? Die Rechnung in u.a. HTML-Seite, eine normale Addition, liefert in NS 4.73, Opera 6.0 und IE 5.5 das gleiche Ergebnis: 16.549999999999997.
Wenn ich nachrechne, kommt 16.55 raus. Kann man sich nicht mal mehr auf die Rechenknechte verlassen? Oder habe ich einen Bug in der Arithmetikeinheit meines betagten AMD K6-2/550 entdeckt?

Was mein Ihr dazu?

<html>
<head>
<title>Rechenfehler?</title>
<script language="JavaScript">
   function addition()
   {
     preis=0;
     preis += 4;
     preis += 7;
     preis += 0.65;
     preis += 0.7;
     preis += 0.85;
     preis += 0.5;
     preis += 0.85;
     preis += 0.85;
     preis += 0.65;
     preis += 0.5;

alert (preis);
   }
</script>
</head>
<body onload="addition()">
 Rechenfehler???
</body>
</html>

Herzliche Grüße, eine schönen Sonntag noch,
Gruß Frank

  1. Hallo Frank

    Kann ich nicht rechnen oder hat JavaScript ein Problem?

    Weder noch. Hier handelt sich um ein grundsätzliches Problem.

    Du verwendest und rechnest mit Dezimalzahlen. Intern rechnet ein Computer mit Dualzahlen. Der Rundungsfehler entsteht auf Grund der internen Umwandlung.

    Mit alert((0.7).toString(2)) oder alert((0.65).toString(2)) kannst du sehr schnell die Ursache nachvollziehen.

    Wenn ich nachrechne, kommt 16.55 raus. Kann man sich nicht mal mehr auf die Rechenknechte verlassen?

    Doch kannst du :-). JavaScript korrigiert im Gegensatz zu deinem Taschenrechner nicht den Rundungsfehler. Das mußt du schon selbst erledigen.

    Viele Grüße

    Antje

    1. Hallo Antje

      Kann ich nicht rechnen oder hat JavaScript ein Problem?

      Weder noch. Hier handelt sich um ein grundsätzliches Problem.

      Du verwendest und rechnest mit Dezimalzahlen. Intern rechnet ein Computer mit Dualzahlen. Der Rundungsfehler entsteht auf Grund der internen Umwandlung.

      Also doch - ich habe es befürchtet. Nicht der Prozessor oder JavaScript ist das Problem - ich hätte selbst drauf kommen müssen. In der Zeit, als wir noch Progamme mittels Diodenbrücken auf eine Zeilen/Spaltenmatrix gesteckt (geschrieben) haben (war flexibler als das Lochen von Pappkärtchen ;-), da war die Basis 2 allgegenwärtig. Da hattest Du zu jedem Bit ein persönliches Verhältnis...
      Aber wer denkt denn heute noch daran, daß da in der Kiste immer noch mit "an und aus" gerechnet wird - wo alles soooo schön bunt ist ;-)

      Danke an Antje und an alle anderen Antworter
      Viele Grüße
      Frank

  2. Hallo! Hab´s auch gerade mal ausprobiert mit IE und Intel Pentium. Die Ausgabe ist bei mir 16.549999999999997, also auch falsch. Warum auch immer er rechnet nach der 7. Addition (da wo das 2.mal 0,85 addiert wird) falsch. Zumindest mit dieser Zahl. Gibt man anstatt 0,85 einfach mal 0,95 ein, so rechnet er an dieser Stelle zwar trotzdem falsch, kommt aber letztendlich auf richtige Endergebnis.
    Also an Deinem Prozessor liegt das nicht. Aber woran...keine Ahnung...ich bastel nochmal dran rum. Sehen wir vielleicht den Wald vor lauter Bäumen nicht???

    Gruss
    S.

    Hallo allemiteinander!

    Kann ich nicht rechnen oder hat JavaScript ein Problem? Die Rechnung in u.a. HTML-Seite, eine normale Addition, liefert in NS 4.73, Opera 6.0 und IE 5.5 das gleiche Ergebnis: 16.549999999999997.
    Wenn ich nachrechne, kommt 16.55 raus. Kann man sich nicht mal mehr auf die Rechenknechte verlassen? Oder habe ich einen Bug in der Arithmetikeinheit meines betagten AMD K6-2/550 entdeckt?

    Was mein Ihr dazu?

    <html>
    <head>
    <title>Rechenfehler?</title>
    <script language="JavaScript">
       function addition()
       {
         preis=0;
         preis += 4;
         preis += 7;
         preis += 0.65;
         preis += 0.7;
         preis += 0.85;
         preis += 0.5;
         preis += 0.85;
         preis += 0.85;
         preis += 0.65;
         preis += 0.5;

    alert (preis);
       }
    </script>
    </head>
    <body onload="addition()">
    Rechenfehler???
    </body>
    </html>

    Herzliche Grüße, eine schönen Sonntag noch,
    Gruß Frank

  3. Hallo,

    Kann ich nicht rechnen oder hat JavaScript ein Problem? Die Rechnung in u.a. HTML-Seite, eine normale Addition, liefert in NS 4.73, Opera 6.0 und IE 5.5 das gleiche Ergebnis: 16.549999999999997.
    Wenn ich nachrechne, kommt 16.55 raus. Kann man sich nicht mal mehr auf die Rechenknechte verlassen? Oder habe ich einen Bug in der Arithmetikeinheit meines betagten AMD K6-2/550 entdeckt?

    Fließkommazahlen werden intern als Binaerbrueche dargestellt (genauer: Mantisse als Binaerbruch und  Exponent als Binaerzahl sowie das Vorzeichen), sodass es vorkommen kann, dass sich unendliche Brueche ergeben.

    Der Speicherplatz fuer eine Zahl ist jedoch beschraenkt, d. h. die unendliche Binaerdarstellung kann nur bis zu einer bestimmten Stelle gespeichert werden. Daraus folgen solche Ungenauigkeiten. Mit einer geeigneten Rundung sollten sich dennoch "korrekte" Ergebnisse erhalten lassen.

    MfG, Thomas

  4. Hallo!
    Die Ursache wurde bereits geklärt. Einfache Abhilfe ist, zum Beispiel nicht in Euro sondern in Cent zu rechnen und am Ende durch 100 zu divieren. Das klappt allerdings nur, wenn die Zahlen nicht zu groß werden, aber du wirst ja nicht mit Milliarden Euro rechnen :o)

    Viele Grüße,
    Alexander Kirk