Heim >Web-Frontend >js-Tutorial >So lösen Sie das Problem mehrerer Dezimalstellen in der JS-Dezimaloperation
Bezüglich des Problems mehrerer Dezimalstellen beim Addieren, Subtrahieren, Multiplizieren und Dividieren von Dezimalzahlen habe ich es selbst studiert und entsprechende Tests durchgeführt. Freunde in Not können sich darauf beziehen.
Lassen Sie mich einen interessanten Test mit Ihnen teilen:
0,1 0,2 == 0,3 //falsch
Ich war plötzlich deprimiert, okay! Es stellt sich heraus, dass aus 0,1 0,2 wird: 0,30000000000000004
Weitere 2,4/0,8 => 2,9999999999999996 Es gibt keine Möglichkeit, es zu ändern und es in eine ganze Zahl (2,4 * 100)/(0,8 * 100) umzuwandeln
10,22 Nun wir Um das Ergebnis zu erhalten, muss 0,11 subtrahiert werden. Der Wert 10,110000000000001 enthielt viele Dezimalstellen, und dann habe ich die toFixed-Methode verwendet, um die Dezimalstellen zu filtern, aber ich weiß nicht, welche effizienter ist als die vorherige Konvertierungsmethode in eine Ganzzahl umwandeln und dann ausführen. Gut! Versuchen wir es noch einmal!
var date1 = new Date(); for(var i = 0; i < 10000; i++){ var result1 = (10.22 - 0.11).toFixed(2); } alert(new Date() - date1);//效率低 var date2 = new Date(); for(var j = 0; j < 10000; j++){ var result2 = (10.22 * 1000 - 0.11 * 1000) / 1000; } alert(new Date() - date2);//效率高 alert(0.1 + 0.2 == 0.3); //既然返回false alert(0.1 + 0.2); //既然返回0.30000000000000004 alert(parseFloat(0.1) + parseFloat(0.2)); //还是返回0.30000000000000004
Ich habe einige Informationen überprüft, einer ist ein Fehler in der JavaScript-Gleitkommaberechnung und der andere hängt mit der endgültigen Konvertierung des Computers in die Binärberechnung zusammen, aber Warum nicht alle Dezimalstellen auftreten. Ich weiß es noch nicht. Ich werde es eingehend untersuchen, wenn ich Zeit habe.
Lösung:
Es gibt zwei Möglichkeiten, dieses Problem zu lösen. Die erste besteht darin, die toFixed(n)-Methode von JavaScript zu verwenden, um N Dezimalstellen direkt zu erhalten. Ich persönlich bin jedoch der Meinung, dass diese Methode einige Probleme mit der Datengenauigkeit haben wird. Es kann verwendet werden, wenn die Anforderungen an die Datengenauigkeit nicht hoch sind.
alert((0.1 + 0.2).toFixed(1));
Die zweite Methode besteht darin, die Berechnungsmethode selbst zu schreiben. Im Folgenden finden Sie eine benutzerdefinierte Additionsfunktion, mit der Sie die oben genannten Probleme vermeiden können.
//自定义加法运算 function addNum (num1, num2) { var sq1,sq2,m; try { sq1 = num1.toString().split(".")[1].length; } catch (e) { sq1 = 0; } try { sq2 = num2.toString().split(".")[1].length; } catch (e) { sq2 = 0; } m = Math.pow(10,Math.max(sq1, sq2)); return (num1 * m + num2 * m) / m; } alert(addNum(0.1, 0.2));
Natürlich kann es auch einfach geschrieben werden als: alarm((num * 3 10 * 3) /3); Auf diese Weise ist N mehrere Dezimalzahlen Orte werden nicht angezeigt.
alert((num * 3 10 * 3) /3); und warning(num 10); Es gibt einen Unterschied zwischen diesen beiden Schreibmethoden, wenn der Computer sie auf der untersten Ebene in Binäroperationen umwandelt Der Grund für das oben genannte Problem ist, oder wir müssen es eingehend untersuchen und Sie können es ausführlicher besprechen.
Das Obige ist der gesamte Inhalt dieses Kapitels. Weitere verwandte Tutorials finden Sie unter JavaScript-Video-Tutorial!