Heim  >  Artikel  >  Web-Frontend  >  Lösung fürBerechnungsfehler in Javascript behoben

Lösung fürBerechnungsfehler in Javascript behoben

黄舟
黄舟Original
2017-08-22 10:40:211930Durchsuche

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
Um es einfach auszudrücken: Erwägen Sie das Aufrunden auf fünf. Wenn die Zahl nach fünf nicht Null ist, dann addieren Sie eins. Wenn die Zahl nach fünf Null ist, schauen Sie sich die ungerade oder gerade Zahl an ist die Zahl vor fünf gerade, sollte sie verworfen werden. Ist die Zahl vor fünf ungerade, sollte sie um eins gerundet werden.

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

Ungleich Null nach 5:



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

Die Zahl nach 5 ist Null: Da diese Situation etwas ganz Besonderes ist, handelt es sich um einen Rechenfehler im toFixed Methode, daher habe ich viele Bestätigungen durchgeführt und sie in gängigen Mainstream-Browsern getestet:

Nehmen Sie die folgenden Testfälle als Beispiel:



Die Ergebnisse für Chrome, Firefox, Safari und Opera lauten wie folgt:

0,01
0,01

0,03
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,04

0,06

0,07
0,07
0,09
0,10


ie11 Ergebnisse sind wie folgt:


0,01
0,02

0,03

0,04
0,05

0,06

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn