kom: Math.Round() rechnet falsch

Hallo,
eigentlich sollte Math.round(2.1350*100) = 214 liefern. Dies ist aber nicht der Fall.
Wie bekomme ich den korrekten Wert?
Gruß
kom

  1. Hallo kom!

    Wie bekomme ich den korrekten Wert?

    Du bekommst den korrekten Wert, da nicht Math.Round den Fehler produziert sondern Deine Multiplikation: 213.49999999999997  gerundet gibt nun mal 213.

    Ein paar Infos dazu.

    Schönen Gruß

    Afra

  2. Hello out there!

    eigentlich sollte Math.round(2.1350*100) = 214 liefern. Dies ist aber nicht der Fall.

    Forum-FAQ: Wieso habe ich beim Rechnen mit Dezimalzahlen Rechenfehler?

    See ya up the road,
    Gunnar

    --
    “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
  3. gudn tach!

    eigentlich sollte Math.round(2.1350*100) = 214 liefern. Dies ist aber nicht der Fall.
    Wie bekomme ich den korrekten Wert?

    die gruende dafuer wurden ja bereits genannt. aber die loesung
    http://www.dcljs.de/faq/antwort.php?Antwort=rechnen_runden#4 ist gar keine.

    mir faellt spontan dazu nur die moeglichkeit ein, die dritte ziffer hinter dem komma zu betrachten und zu untersuchen, ob sie kleiner als 5 oder groesser als 4 ist.
    im fall <5 wird einfach der rest abgeschnitten und dann mit 100 multipliziert.
    im fall >4 wird das gleiche gemacht, aber anschliessend noch das resultat inkrementiert.

    eine andere moeglichkeit waere vielleicht, eine toleranz z.b. tol=1e-13 einzufuehren und zu ueberpruefen, ob
    x*100>Math.round(x*100) && 0.5-(x*100-Math.round(x*100))<tol
    ist und in diesem fall immer _auf_zurunden (statt abzurunden).

    prost
    seth

    1. Hallo seth,

      Die "richtige" Lösung, wenn man wirklich exakte Ergebnisse braucht, ist natürlich, exakt zu rechnen. Statt Fließkommazahlen nimmt man einfach vollständig gekürzte Brüche. Mit zwei Iteger-Zahlen lassen sich da die wichtigsten Operationen auch halbwegs effizient implementieren.
      Wenn man einen Algortihmus hat, der wirklich exaktes rechnen Benötigt, gibt es meines Wissens keine bessere alternative.

      Grüße

      Daniel

      1. Hello out there!

        Die "richtige" Lösung, wenn man wirklich exakte Ergebnisse braucht, ist natürlich, exakt zu rechnen. Statt Fließkommazahlen nimmt man einfach vollständig gekürzte Brüche.

        Wenn man sich auf die Grundrechenarten und Potenzen mit ganzzahligen Exponenten beschränkt, geht das. Andere Operationen liefern irrationale Ergebnisse.

        Einfache Wurzeln ließen sich ja noch als Tripel von Ganzzahlen darstellen:
        [latex]\frac{1}{2}\sqrt[3]{20}=\sqrt[3]{\frac{5}{2}}=(5,2,3)[/latex]

        Schon bei Zahlen wie [latex]\sqrt{2}+\sqrt{3}[/latex] oder [latex]\sqrt{1+\sqrt{2}}[/latex] dürfte das problematisch werden. Und bei nichtalgebraischen erst ...

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
        1. Hallo Gunnar,

          Ja, für Wurzeln oder irgendwelche Funktionswerte (sin, log, ...) muss man sich natürlich wieder mit Näherungswerten zufrieden geben. Algorithmen, die exakte Arithmetik benötigen, kommen dann aber idR mit Addition, Subtraktion, Multiplikation und Division aus. Alles andere ist wirklich schwierig bis gar nicht zu realisieren.

          Man kann natürlich versuchen Zahlen durch Berechnungsvorschriften zu repräsentieren und es gibt Leute, die meinen, das reicht auch völlig aus. Allerdings ist das wohl nur noch mathematisch interessant. Darauf rechnen kann man nicht mehr.

          Grüße

          Daniel