Floating -point -Fehler treten auf, wenn der Multiplikationsbetrieb der Dezimalmultiplikation in JS sie testen können:
<Script>
Alarm (11*22,9)
</script>
Das Ergebnis war 251.8999999999998 anstelle von 251.9
Es muss viele Menschen Kopfschmerzen geben. Wie kann man es also lösen? Hier wird die Lösung gegeben.
1,,
Kopieren Sie den Code -Code wie folgt:
<Script>
Alarm (11*(22,9*10)/10);
</script>
Die ungefähre Idee, das Problem zu lösen, ist, dass der Faktor zuerst in eine Ganzzahl vergrößert und schließlich durch das entsprechende Mehrfachteil geteilt wird, damit das richtige Ergebnis erhalten werden kann.
2,
Kopieren Sie den Code -Code wie folgt:
<Script Defer>
Number.Prototype.raate = function () {
var os.toString ();
if (ostr.indexof (".") ==-1)
Rückkehr 1;
anders
Return math.pow (10, parseInt (osr.length-organ.indexof (".");
}
Funktion trans () {
args = trans.argumente;
var test = 1;
für (i = 0; i <args.length; i ++)
temp*= args [i]*args [i] .raate ();
für (i = 0; i <args.length; i ++)
temp/= args [i] .raate ();
Temperatur zurückgeben
}
Alarm (trans (11,22,9));
</script>
Diese Lösung ist eine problematischere Methode, kann aber wahrscheinlich den tatsächlichen Prozess der Lösung dieses Problems verstehen.
Sie können auch die Methode von vier Häusern und fünf eingehenden Methoden verwenden. .
Kopieren Sie den Code -Code wie folgt:
Funktion FORDIGHT (DIGHT, WIE) {
Dight = math.round (dight*math.pow (10, wie))/math.pow (10, wie);
Zurückkehren;
}
// außer der Methode, um die genaue Methode zum Entfernen der Methode zu erhalten
// Beschreibung: Die Ergebnisse von JavaScript haben einen Fehler, und es ist offensichtlich, wenn die beiden schwimmenden Punktzahlen entfernt werden. Diese Funktion gibt ein genaueres Entfernungsergebnis zurück.
// rufen Sie: ACCDIV (Arg1, Arg2)
// Rückgabewert: Arg1 außer den genauen Ergebnissen von Arg2
Funktion accdiv (arg1, arg2) {{{{{{{{{{{{{{{{{{{{
var t1 = 0, t2 = 0, r1, r2;
Versuchen Sie {t1 = arg1.toString ().
Versuchen Sie {t2 = arg2.toString ().
mit (math) {
R1 = nummer (arg1.tostring (). Ersetzen (".", ""))
r2 = nummer (arg2.tostring (). ersetzen (".", ""))
Return (r1/r2)*pow (10, t2-t1);
}
}
// Fügen Sie eine DIV -Methode zum Nummerntyp hinzu, die bequemer zu rufen ist.
Number.Prototype.div = function (arg) {
Return Accdiv (this, arg);
}
// Multiplikationsfunktion, um genaue Multiplikationsergebnisse zu erhalten
// Beschreibung: Die Ergebnisse der JavaScript -Multiplikationsergebnisse haben einen Fehler, und es ist offensichtlich, wenn die beiden schwimmenden Punktzahlen multipliziert werden. Diese Funktion gibt ein genaueres Multiplikationsergebnis zurück.
// rufen Sie an: Accmul (arg1, arg2)
// Rückgabewert: Arg1 wird mit den genauen Ergebnissen von Arg2 multipliziert
Funktion accmul (arg1, arg2)
{{{{
Varm M = 0, s1 = arg1.toString (), s2 = arg2.toString ();
Try {m+= s1.split (".") [1] .Length} catch (e) {}
Try {m+= s2.Split (".") [1] .Length} catch (e) {}
Rückgabenummer (S1.Replace (".", "")*Nummer (S2.Replace (".
}
// Fügen Sie eine MUL -Methode zum Nummerntyp hinzu, der bequemer zu rufen ist.
Number.Prototype.mul = function (arg) {
Return accmul (arg, this);
}
// Methode hinzufügen, um genaue zusätzliche Ergebnisse zu erhalten
// Beschreibung: Die Ergebnisse von JavaScript haben einen Fehler, und es wird offensichtlicher sein, wenn die beiden schwimmenden Punktzahlen hinzugefügt werden. Diese Funktion gibt ein genaueres Ergebnis der Addition zurück.
// rufen Sie an: accidd (arg1, arg2)
// Rückgabewert: Arg1 plus die genauen Ergebnisse von Arg2
Funktion Acadd (arg1, arg2) {{{
var r1, r2, m;
Versuchen Sie {r1 = arg1.toString ().
Versuchen Sie {r2 = arg2.toString ().
m = math.pow (10, math.max (r1, r2)))
Return (arg1*m+arg2*m)/m
}
// Fügen Sie eine Methode hinzu, die zum Nummerntyp hinzugefügt wird, was bequemer zu rufen ist.
Number.prototype.add = function (arg) {
Return Acadd (arg, this);
}