Im Chrome JavaScript-Konsole Typ I die folgenden:Javascript - Berechnungsfehler
3.1 * 3.68
Und das Ergebnis zurückgegeben wird:
11.408000000000001
Warum ist das Ergebnis nicht:
11.408
Im Chrome JavaScript-Konsole Typ I die folgenden:Javascript - Berechnungsfehler
3.1 * 3.68
Und das Ergebnis zurückgegeben wird:
11.408000000000001
Warum ist das Ergebnis nicht:
11.408
Fließkommafehler sind ziemlich normal, dies liegt an den Problemen, die mit der Darstellung einiger Gleitkommazahlen in binärer Form verbunden sind.
Lesen Sie dieses: What Every Computer Scientist Should Know About Floating-Point Arithmetic.
Also was ist die Lösung Mann? Sollte ich zuerst eine wissenschaftliche Arbeit darüber lesen? – Toskan
Der Grund für das 'komische' Ergebnis ist wegen ungenauer Gleitkommadarstellung innerhalb bestimmter Zahlen. Während 3,1 * 3,68 15 Dezimalstellen ergibt, ergeben sowohl 3,11 * 3,68 als auch 3,1 * 3,67 die erwarteten 4 Dezimalstellen bzw. 3 Dezimalstellen.
In der Praxis kann dieser JavaScript-Fehler zu einem Rundungsfehler führen, wenn das erwartete Ergebnis 3 Dezimalstellen wie .745 hat und das Gleitkommaergebnis .744999999999999. Beispiel: 1,9 * 3,55 = 6,744999999999999 (sollte 6.745 sein). Für Finanzabschlüsse gibt Javascript-Programm 6.74 statt der erwarteten Rundung von 6.75. Ein großer Kopfschmerz für die Abrechnung, obwohl es weniger als 1 von 1000 Fällen passiert.
Eine Möglichkeit, die exakten Ergebnisse zu erhalten, ist für einen Javascript-Programmierer nachbearbeiten das Ergebnis wie in:
var r=1.9*3.55; r=r.toFixed(3); //=6.745, knowing that the results should be 3 decimals r=r.toFixed(2); // round to 2 decimals
Es ist bedauerlich, dass keine heute JavaScript-Engine diesen kleinen einfachen Schritt tun kann, um die ankommen erwartetes Ergebnis. Um eine genaue Dezimalarithmetik zu garantieren (zumindest für den finanziellen Gebrauch im Gegensatz zur wissenschaftlichen oder astronomischen Verwendung), muss JavaScript Engine nur n = (Anzahl der Dezimalstellen im Ergebnis) bestimmen und dann ToFixed (n) im internen Floating Punktergebnis.
was ich mache ist immer tun * 10 so var r = ((1,9 * 10) * (3,55 * 10))/10 –
können Sie toFixed Methode von JavaScript ausführlicher verwenden:
Methode der Anzahl
Implementiert in JavaScript 1,5
ECMAScript Ausgabe ECMAScript 3rd Edition
Syntax
Number.toFixed ([digits])
Parameter
digits Die Anzahl der Stellen hinter dem Komma zu erscheinen; Dies kann ein Wert zwischen 0 und 20 sein, und Implementierungen können optional einen größeren Bereich von Werten unterstützen. Wenn dieses Argument nicht angegeben, wird er behandelt, als 0.
Returns
Eine String-Darstellung Zahl, die nicht Exponentialnotation nicht verwendet und hat genau Ziffern Ziffern nach dem Komma.Die Zahl wird bei Bedarf gerundet, und der Bruchteil wird gegebenenfalls mit Nullen aufgefüllt, so dass er die angegebene Länge hat. Wenn die Zahl größer als 1e + 21 ist, ruft diese Methode einfach Number.toString() auf und gibt eine Zeichenfolge in Exponentialschreibweise zurück.
Wirft
Auslöser Range Wenn Ziffern zu klein oder zu groß ist. Werte zwischen 0 und 20 (einschließlich) verursachen keinen RangeError. Implementierungen können auch größere und kleinere Werte unterstützen. TypeError Wenn diese Methode für ein Objekt aufgerufen wird, das keine Nummer ist.
für Ihr Problem verwenden (3.1 * 3.68) .toFixed (3); //11.408
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toFixed
http://stackoverflow.com/questions/273371/real-vs-floating-point-vs-money –
was ist die Lösung? – Toskan
ah, die Lösung ist das: http://stackoverflow.com/a/14728473/533426 – Toskan