1. Berechnen Sie JS, um zu berechnen
12.32 * 7 Was ist das Ergebnis?
Antwort: 86.240000000000001
Warum tritt dieses Problem auf? Wie löst ich es?
Es gibt einen Fehler, wenn sich JS mit der Multiplikation und der Aufteilung von Dezimalstellen befasst. Die Lösung kann sein: Verwandeln Sie die Dezimalzahl in eine Ganzzahl, um damit umzugehen.
Die obige Berechnung kann geändert werden auf:
12.32 * 100 * 7 /100
Das Ergebnis ist: 86,24, richtig.
Berechnen wir es noch einmal:
8,80 * 100 * 12 /100
Ergebnis: 105.6000000000002
Ähnliche Probleme treten bei 38,80 auf.
Erhöhen Sie die Genauigkeit um das 10 -fache:
8,80 * 1000 * 12 /1000
Ergebnisse: 105.6
Es ist normal.
16.40 * 1000000 * 6 /1000000
Es gibt Probleme mit dem Ergebnis
Um die Ausführung von JS genauer zu machen, kann der Wert in der nachfolgenden JS -Dezimalberechnung direkt um das 10.000 -fache erweitert und dann durch 10.000 geteilt werden, um das Problem zu lösen.
var num = 38,80;
var num2 = 13;
Alarm (Num * 10000 * 12 /10000);
Die Anzahl multipliziert und geteilt mit 10.000 ist am besten zum Testen geeignet. Einige Zahlen haben Probleme, wenn sie kleiner sind, und einige Zahlen haben Probleme, wenn sie größer sind (1000.000).
zwei,
<Script> number.prototype.rate = function () {varoSTR = this.toString (); if (ostr.Indexof (".") ==-1) return1; ElserTurnMath. functionTran () {args = tran.Argumente; vartemp = 1; für (i = 0; i <argsgth; i ++) temp*= args [i]*args [i] .rate (); für (i = 0; i <args.länge; i ++) temp/= args [i] .rate ();; </script>Diese Lösung ist eine umständlichere Lösung, kann jedoch ein grobes Verständnis für den tatsächlichen Prozess der Lösung dieses Problems vermitteln.
// Divide -Funktion wird verwendet, um genaue Abteilungsergebnisse zu erhalten // Hinweis: Im Abteilung Ergebnis von JavaScript werden Fehler aufgenommen, was bei der Aufteilung von zwei schwimmenden Punktzahlen offensichtlicher wird. Diese Funktion gibt ein genaueres Abteilungsergebnis zurück. // Anruf: ACCDIV (Arg1, Arg2) // Rückgabewert: Das genaue Ergebnis von Arg1 geteilt durch Arg2 -Funktion ACCDIV (arg1, arg2) {var t1 = 0, t2 = 0, r1, r2; try {t1 = arg1.toString (). split (".") [1] .Length} catch (e) {} try {t2 = arg2.toString (). Split (".") [1] .Leng th} catch (e) {} mit (math) {r1 = nummer (arg1.toString (). ersetzen (".", ")) r2 = nummer (arg2.toString (). ersetzen (" (R1/R2)*POW (10, T2-T1);}} // Fügen Sie dem Nummerntyp eine DIV-Methode hinzu, sodass es bequemer ist, sie anzurufen. Number.Prototype.div = Funktion (arg) {return accdiv (this, arg);} // Mehrfachfunktion wird verwendet, um genaue Multiplikationsergebnisse zu erhalten // Hinweis: Es wird Fehler in den Multiplikationsergebnissen von JavaScript erhalten, was bei der Multiplikation von zwei Schwimmpunktzahlen deutlicher wird. Diese Funktion gibt ein genaueres Multiplikationsergebnis zurück. // Anruf: Accmul (Arg1, Arg2) // Rückgabewert: Das genaue Ergebnis von Arg1 multipliziert mit Arg2 -Funktion Accmul (arg1, arg2) {var m = 0, s1 = arg1.toString (), s2 = arg2.toString (); try {m+= s1.Split (".") [1] .Length} catch (e) {} try {m+= s2split zurück Nummer (S1.Replace (".", "))*Nummer (S2.Replace (". Number.Prototype.mul = Funktion (arg) {return accmul (arg, this);} // Additionsfunktion wird verwendet, um genaue Additionsergebnisse zu erhalten // Hinweis: Das Additionsergebnis von JavaScript gibt es bei der Hinzufügung von zwei Floating-Punktnummern Fehler. Diese Funktion gibt ein genaueres Additionsergebnis zurück. // Anruf: Accadd (Arg1, Arg2) // Rückgabewert: Das genaue Ergebnis von Arg1 plus arg2 -Funktionscadd (arg1, arg2) {var r1, r2, m; try {r1 = arg1.toString (). split (".") [1] .Length} catch (e) {r1 = 0} try {r2 = arg2.toString (). split (".") [1] .Length} catch (e) {{} mathd. math (arg1*m+arg2*m)/m} // Fügen Sie dem Nummerntyp eine Methode hinzu, sodass es bequemer ist, aufzurufen. Number.prototype.add = function (arg) {return accadd (arg, this);}Die obige JavaScript -Dezimalmultiplikationsergebnisfehlerbehandlung ist der gesamte Inhalt, den ich mit Ihnen geteilt habe. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.