Gernot Weise: Falsche Ergebnisse bei floats

Hallo Forum,

für eine Reisekostenabrechung im Intranet, benötige ich einfache Rechenfunktionen, die ich über Javascript realsiere.
Dabei ist mir folgendes aufgefallen:

z.B.
4.77 * 10 = 47.699999999999996

m?

Das gleiche Ergebnis, liefert der unter
http://www.teamone.de/selfhtml/tedca.htm
ersetellte Taschenrechner.

Muß ich mich mit dieser geringfühgigen Ungenauigkeit in Javascript abfinden oder gibt es da eine Lösung?
Ist in diesem Zusammenhang mit andern Abweichungen zu rechnen (im doppelten Wortsinn)?

Sollte das Problem in Javascript nicht zu handlen sein, ist es ratsam die Rechnenfunktionalitäten über ein unsichtbares Applet zu realsieren?

Vielen Dank schon mal für die Hilfe und vielen Dank auch für das klasse Forum an Stefan und all die anderen Helfer. Wenn das Forum erst mal geschlossen ist, bemerkt man wie häufig man doch darauf immer wieder zugreift.

Gruss,
Gernot

  1. Hallo Gernot,

    das Problem besteht in wohl allen Sprachen, daß die Fließkommaberechnung rel. ungenau ist.

    Abhilfe:

    Da du ja nur zwei Nachkommastellen benötigst (bzw. in Deinem Beispiel ja nur eine...):

    <script language="javascript">
    function format(was)
    {
      was = Math.round (was*100) / 100;
      return was;
    }
    </script>

    ...

    und dann im HTML:

    document.write(format(deinezahl));

    Ich hoffe, das hilft Dir!

    Reiner

    1. hallo,

      das Problem besteht in wohl allen Sprachen, daß die Fließkommaberechnung rel. ungenau ist.

      jein.
      das problem besteht eigentlich darin, dass die _umrechnung_ der dezimalzahl in eine dualzahl (im float-bereich wohlgemerkt) ungenau ist. (IEEE 754 - Standard - es haengt ueber den faktor ln(2) zusammen, einfach ausgedrueckt)
      0.1 zum beispiel ist als dualzahl eine periodische zahl. daher die fehler.
      besonders bemerkbar macht sich das problem bei der subtraktion. man sollte also solche operationen wie beispielsweise 10000.1 - 10000 (da kommt niemals beim dualrechner 0.1 raus...) moeglichst bleiben lassen, da hier auesserst unerwuenschte ergebnisse entstehen.

      man koennte natuerlich eine dezimale rechnung simulieren, die waere aber
      a) ziemlich aufwendig und
      b) ziemlich langsam
      wuerde also in den (aller-)meisten faellen nicht das aufwand-nutzen-verhaeltnis verbessern.

      uebrigens:
      Taschenrechner, die man so handelsueblich zu kaufen bekommt haben dieses problem nicht, da sie gar nicht erst in dualzahlen umrechnen, sondern dezimal rechnen.

      cua

      n.d.p.

  2. hi gernot

    Das gleiche Ergebnis, liefert der unter
    http://www.teamone.de/selfhtml/tedca.htm
    ersetellte Taschenrechner.

    <grübel>bei mir nich</grübel>

    ciao stefan