2010-12-03 9 views
5

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 
+0

http://stackoverflow.com/questions/273371/real-vs-floating-point-vs-money –

+0

was ist die Lösung? – Toskan

+0

ah, die Lösung ist das: http://stackoverflow.com/a/14728473/533426 – Toskan

Antwort

2

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.

+1

was ich mache ist immer tun * 10 so var r = ((1,9 * 10) * (3,55 * 10))/10 –

3

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

Verwandte Themen