Javascript Rundungsfehler

Seite 1 von 2 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/javascript_rundungsfehler_216325/page_1 - zur Vollversion wechseln!


Chrissicom schrieb am 19.05.2010 um 22:27

Hi, irgendwie kann Javascript nicht richtig rechnen....

Beispiel:

var foo = 4 * 77.27 und heraus kommt 309.0672 EUR
var baz = 1 * 169.49 und heraus kommt 160.4939 EUR

wtf????


Nico schrieb am 19.05.2010 um 22:30

liegt ein hw-fehler vor?

script posten?


Chrissicom schrieb am 19.05.2010 um 22:33

K.a. ist nen Webpaket auf einem Fremden Server. Mit PHP rechnet er richtig.

Kann er durch eine sterbende CPU so einen Mist ausrechnen mit Javascript und PHP geht trotzdem? Die Fehler sind btw nicht zufällig, er kommt immer zu den selben falschen Ergebnissen.

Ich versteh vor allem nicht wie aus 1*X = X.foo werden kann.


SilentBob schrieb am 19.05.2010 um 22:36

ist ganz normal

http://www.dcljs.de/faq/antwort.php...rechnen_rechnen


Nico schrieb am 19.05.2010 um 22:39

thx, ist mir noch nie zu ohren gekommen :eek:


Chrissicom schrieb am 19.05.2010 um 22:41

Ah cooler Link, werde das mit dem kaufmännischen Runden mal testen... obwohl ich das Math.round(n*100)/100 vorher schon probiert hatte und es zum gleichen Fehler geführt hat... allerdings ohne toString.... na ja mal testen, verzweifle an dem Käse grad :D

Cool, Danke, so funktionierts (ganzer Code):

document.getElementById("myPrice").firstChild.nodeValue = roundRecommendation + " Pakete * " + kaufm(fullPrice) + " \u20ac pro Paket = " + kaufm(roundRecommendation*kaufm(fullPrice)) + " \u20ac";

kaufm(roundRecommendation*kaufm(fullPrice))... sieht etwas krüppelig aus, geht aber nur so.

Die kaufm Methode hab ich einfach kopiert.


Mr. Zet schrieb am 19.05.2010 um 23:07

Zitat von Chrissicom
var baz = 1 * 169.49 und heraus kommt 160.4939 EUR

wtf????

Also DAS ist hoffentlich ein Tippfehler, das wäre doch ein recht dramatischer Rechenfehler :D :p


Nico schrieb am 19.05.2010 um 23:26

also mich hat er erschreckt ;)


that schrieb am 20.05.2010 um 00:37

Also mein Browser rechnet da halbwegs korrekt, zumindest stimmen die Beispiele aus dem ersten Post. Welche JS-Implementierung kann bei dir da nicht korrekt mit 1 multiplizieren?


0.1 + 0.2 ist bei mir auch falsch, wie auf der von SilentBob referenzierten Seite - und ich glaube, das muss sogar sein, damit es standardkonform ist. Bei Excel übrigens genauso, nur zeigt das die Nachkommastellen normalerweise nicht an.


prayerslayer schrieb am 20.05.2010 um 00:46

Zitat von Chrissicom
wtf????

Ganz genau.


Chrissicom schrieb am 20.05.2010 um 00:49

Also ich erhalte in IE 8, Firefox 3.6 und dem neuesten Safari (den Windows Versionen dieser Programme natürlich, FF unter Linux kann durchaus was anderes machen) den genau gleichen Rechenfehler. Wenn es an der "Implementierung der JS Engine" liegt sind also alle gleich schlecht :P

Ich meine wenn 0.1237682734*12376876*0.50 was falsches liefert ok... aber 1*169.49 wtf.... :D Das ist kein Tippfehler @Mr. Zet... macht Konqueror das denn richtig sofern er JS kann?

Edit:
Haha dieser Link kann einem ja jeglichen JS Spaß verderben :D

Edit 2:
Jetzt seh ichs erst.... da kommt natürlich 169.x raus... aber er fügt eben 2 Nachkommastellen aus dem Nirvana hinzu, was bei 10*foo dann Probleme mit dem Ergebnis macht, weil das völlig falsch wird.


Ringding schrieb am 20.05.2010 um 17:58

Die im Originalpost genannten Beispiele können aber nicht auf die bekannte Binär/Dezimal-Problematik zurückgeführt werden. Damit würde ein Fehler natürlich erst an der 7. Stelle (single precision) oder 15. Stelle (double precision) auftreten.

Mein Browser (Firefox 3.5.9 Mac OS X) liefert auch das erwartete Ergebnis.

Was ist das denn für ein Browser, der so einen Schmarren rechnet?


Ringding schrieb am 20.05.2010 um 18:00

Zitat von Chrissicom
aber er fügt eben 2 Nachkommastellen aus dem Nirvana hinzu

Das kann ich mir kaum vorstellen.

Der Fehler kommt vermutlich von woanders, aber nicht von dem hier gezeigten Code.


Ringding schrieb am 21.05.2010 um 12:41

Jetzt muss ich nochmal meinen Senf dazugeben. Das klassische Problem, das die meisten Leute verwirrt, und weswegen auch die hier verlinkten Seiten existieren, lässt sich in Python schön illustrieren:

>>> 4*77.27
309.07999999999998

Sieht vielleicht falsch aus, ist aber nur um einen Absolutwert von ca. 10^-14 daneben, also doch recht genau. Der relative Fehler ist erwartungsgemäß in der Gegend von 10^-16.

Wenn man z.B. auf 13 Nachkommastellen rundet, sieht man auch sehr schön, dass die Rechnung passt:

>>> "%.13g" % _
'309.08'


manalishi schrieb am 23.05.2010 um 00:45

Zitat von Chrissicom
Edit 2:
Jetzt seh ichs erst.... da kommt natürlich 169.x raus... aber er fügt eben 2 Nachkommastellen aus dem Nirvana hinzu, was bei 10*foo dann Probleme mit dem Ergebnis macht, weil das völlig falsch wird.

etwas mehr vertrauen bitte ;)
ausm nirvana kommen die zwei dezimalen nachkommastellen eben genau nicht.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025