In diesem Artikel wird hauptsächlich die Lösung für den Fehler „toFixed“ in Javascript vorgestellt (der Fehler, sich auf die Rundungsmethode des Bankers zu verlassen). Freunde in Not können sich darauf beziehen
Vorwort
Im Firmenprojekt war ein Modul mit einer Vielzahl von Gleitkomma-Preisberechnungen beteiligt, was bei mir eine Reihe von Gedanken auslöste:
Das Problem des Mangels der Berechnungsgenauigkeit von Gleitkommazahlen in der Computer-Binärumgebung;
console.log(.1+.2); 0.30000000000000004
Um das obige Problem zu lösen, wurde die toFixed-Methode verwendet, jedoch ein Rundungsfehler aufgetreten, bei dem die Dezimalstelle der Gleitkommazahl mit 5 endete; und ich habe endlich einige nützliche Informationen gefunden. Die von toFixed verwendeten Berechnungsregeln sind:
Banker-Rundung: Die sogenannte Banker-Rundungsmethode ist im Wesentlichen eine Methode, bei der auf fünf gerundet und gerade gelassen wird (auch als Aufrunden auf fünf bekannt). und sogar gehen).
var num = 0.045; console.log(num.toFixed(2)); 0.04
Text
Als nächstes überprüfen wir diese sogenannte Bankrundungsmethode. Die Überprüfung ist in drei Situationen unterteilt, wobei 4, 5 und 6 die Rundungsmethoden sind . Bestätigung von toFixed Bits (am Beispiel von Chrome):
mit 4 als Rundungsbit:
in 4. Ende: In diesem Fall funktioniert toFixed ziemlich gut und es gibt keine Fehler.
Verwenden Sie 6 als Rundungsziffer:
var num = 0.004; console.log(num.toFixed(2)); 0.00 var num = 0.014; console.log(num.toFixed(2)); 0.01 var num = 0.094; console.log(num.toFixed(2)); 0.09
Enden Sie mit 6. In diesem Fall verhält sich toFixed Nicht schlecht, keine Fehlerprobleme.
Rundung auf 5:
var num = 0.006; console.log(num.toFixed(2)); 0.01 var num = 0.016; console.log(num.toFixed(2)); 0.02 var num = 0.096; console.log(num.toFixed(2)); 0.10
Wenn die Zahl nach fünf nicht Null ist, wird gemäß den Regeln eins vorgerückt. Wir haben bestätigt, dass kein Problem vorliegt.
Verwendung von 5 als Rundungsziffer:
var num = 0.0051; console.log(num.toFixed(2)); 0.01 var num = 0.0052; console.log(num.toFixed(2)); 0.01 var num = 0.0059; console.log(num.toFixed(2)); 0.01
Nehmen Sie die folgenden Testfälle als Beispiel:
Die Ergebnisse für Chrome, Firefox, Safari und Opera lauten wie folgt:
0,01
0,01
var num = 0.005; console.log(num.toFixed(2)); var num = 0.015; console.log(num.toFixed(2)); var num = 0.025; console.log(num.toFixed(2)); var num = 0.035; console.log(num.toFixed(2)); var num = 0.045; console.log(num.toFixed(2)); var num = 0.055; console.log(num.toFixed(2)); var num = 0.065; console.log(num.toFixed(2)); var num = 0.075; console.log(num.toFixed(2)); var num = 0.085; console.log(num.toFixed(2)); var num = 0.095; console.log(num.toFixed(2));
0,04
0,060,07
0,07
0,09
0,10
ie11 Ergebnisse sind wie folgt:
0,01
0,02
0,04
0,05
0,07
0,08
0,09
0,10
Es ist ersichtlich, dass es unter Ie11 normal ist, aber in anderen Fällen treten Fehler auf Browser. Obwohl es den Regeln der Banker-Rundungsmethode nicht vollständig entspricht, denke ich, dass es an den Fallstricken von Gleitkommazahlen im Binärformat liegt, dass es dieser Regel nicht vollständig entspricht.
Kurz gesagt: Ob toFixed eingeführt wird, um das Problem der mangelnden Präzision bei Gleitkommaberechnungen zu lösen, oder ob die Rundungsmethode des Bankers verwendet wird, alles dient dazu, das Problem der Genauigkeit zu lösen, aber Es kann nicht von der Gleitkommaumgebung des Binärsystems getrennt werden, aber es hat uns zumindest dabei geholfen, das Problem zu finden und eine Lösung zu finden.
Lösung
Unten stelle ich eine Methode durch Überschreiben aufFixed bereit:
Die allgemeine Idee dieser Methode besteht darin, zuerst das Rundungsbit zu finden, zu bestimmen, ob die Position größer oder gleich 5 ist, ein Bit manuell zu runden, wenn die Bedingung erfüllt ist, und dann den ursprünglichen Gleitkommawert zu verstärken Zahl durch den Parameter exponentiell mal 10 durch den Parameter size, und verwenden Sie dann floor, um alle Ziffern einschließlich des Rundungsbits zu entfernen und anhand unseres vorherigen manuellen Übertrags zu bestimmen, ob ein Übertrag erfolgen soll.
Das obige ist der detaillierte Inhalt vonLösung fürBerechnungsfehler in Javascript behoben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!