Geschrieben in den vorhergehenden Worten:
Heute habe ich meinem Kollegen geholfen, ein Problem zu lösen, nämlich, dass es viele Dezimalstellen gibt, die beim Multiplizieren von Dezimalstellen erscheinen. Ich habe dieses Problem schon einmal begegnet, also werde ich es speziell zusammenfassen.
Zahlentyp:
Der Zahlentyp ist der am häufigsten verwendete und interessanteste Typ in ECMascript. Dieser Typ verwendet das IEEE754-Format, um Ganzzahlen und Gleitpunktwerte darzustellen (Floating-Punkt-Werte sind in einigen Sprachen auch doppelte Präzisionswerte). Um verschiedene Datentypen zu unterstützen, definiert ECMA-262 verschiedene numerische Oberflächenformate.
Dezimal:
var intnum = 10; //Ganze Zahl
Oktal:
var Octalnum1 = 070; // Oktal 56
var Octalnum2 = 079; // Ungültiger Oktalwert aufgelöst als 79
Oktalliterale sind im strengen Modus ungültig;
hexadezimal:
var hexnum1 = 0xa; // 10
Denken Sie daran: Bei der Durchführung von Operationen werden alle Werte in Oktal und Hexadezimal schließlich in Dezimalheit umgewandelt.
Warum hat der Betrieb von Dezimalstellen Fehler?
Der höchste Fortschritt eines Gleitpunktwerts ist eine 17-stellige Dezimalzahl, aber seine Genauigkeit ist bei der Durchführung von Operationen weitaus geringer als die einer Ganzzahl. Ganzzahlen werden bei der Durchführung von Operationen in Dezimalheit umgewandelt. und bei der Berechnung der Dezimaloperationen in Java und JavaScript werden die Dezimalerdezimalstellen zunächst in den entsprechenden Binärum umgewandelt, und einige Dezimalstellen können nicht vollständig in binär konvertiert werden, sodass der erste Fehler hier auftritt. Nachdem alle Dezimalstellen in Binärum umgewandelt werden, werden die binären Operationen durchgeführt, um das binäre Ergebnis zu erzielen. Konvertieren Sie dann das binäre Ergebnis in Dezimaler, und der zweite Fehler tritt normalerweise hier auf.
Also (0,1+0,2)! = 03
Lösung:
Programmcode
Divisionsfunktion, um genaue Abteilungsergebnisse zu erhalten
Hinweis: Das Abteilungsergebnis von JavaScript wird Fehler vorliegen, was bei der Aufteilung von zwei schwimmenden Punktzahlen offensichtlicher wird. Diese Funktion gibt ein genaueres Abteilungsergebnis zurück.
Rufen Sie: 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] .Length} catch (e) {} mit (math) {r1 = number (arg1.tostring (). r2 = number (arg2.toString (). ersetzen (".", ") return (r1/r2)*pow (10, t2-t1);}}Das Hinzufügen einer DIV -Methode zum Nummerntyp ist bequemer zu rufen.
Number.Prototype.div = function (arg) {return accdiv (this, arg); }Multiplikationsfunktion, um genaue Multiplikationsergebnisse zu erhalten
HINWEIS: Das Multiplikationsergebnis von JavaScript wird Fehler vorliegen, was bei der Multiplizierung von zwei schwimmenden Punktzahlen offensichtlicher wird. Diese Funktion gibt ein genaueres Multiplikationsergebnis zurück.
Rufen Sie: 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.splen (".") [1] .Length} catch (e) {} try {m+= s2split (".") [1] .Length} catch (e) {} Return -Nummer (S1.Replace (".Das Hinzufügen einer MUL -Methode zum Nummerntyp ist bequemer zu rufen.
Number.prototype.mul = function (arg) {return accmul (arg, this);}Additionsfunktion, um genaue Additionsergebnisse zu erhalten
HINWEIS: Das Additionsergebnis von JavaScript wird Fehler vorliegen, was beim Hinzufügen von zwei schwimmenden Punktzahlen offensichtlicher ist. Diese Funktion gibt ein genaueres Additionsergebnis zurück.
Rufen Sie: Accadd (Arg1, Arg2)
Rückgabewert: Das genaue Ergebnis von arg1 plus arg2
Funktion Acadd (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) {r2 = 0} mmatmmath.pow (10, 10, 10, math.max (10, math.max, math.max, math.max, math.max (10, math.max (arg1*m+arg2*m)/m}Fügen Sie dem Nummerntyp eine Methode hinzu, sodass es bequemer ist.
Number.prototype.add = function (arg) {return accadd (arg, this);}Fügen Sie diese Funktionen hinzu, wo Sie verwenden möchten, und rufen Sie sie anschließend an, um zu berechnen.
Wenn Sie beispielsweise berechnen möchten: 7*0,8, ändern Sie es in (7) .mul (8)
Andere Operationen sind ähnlich und genauere Ergebnisse können erzielt werden.
Lösung 2:
Die häufiger verwendeten Methoden tofixed () und tofixed () können die Zahl mit einer angegebenen Dezimalzahl in Zahlen rundeten. Das Hinzufügen dieser Methode nach unseren Berechnungsergebnissen ist in Ordnung. Aber es wird einen leichten Einfluss auf die Genauigkeit haben. Wenn die Genauigkeitsanforderungen nicht hoch sind, wird empfohlen, sie zu verwenden.