1. Berechnen Sie mit js
12.32 * 7 Was ist das Ergebnis? Antwort: 86.24000000000001
Warum tritt dieses Problem auf? Wie kann man es lösen?
Es gibt einen Fehler in js bei der Multiplikation und Division von Dezimalzahlen. Die Lösung kann sein: Dezimalzahlen zur Verarbeitung in Ganzzahlen umwandeln.
Die obige Berechnung kann wie folgt geändert werden:
12,32*100*7/100
Das Ergebnis ist: 86,24, richtig.
Führen Sie auch einige Berechnungen durch:
8,80*100*12/100
Ergebnis: 105.60000000000002
Ähnliche Probleme treten bei 38,80 auf.
Genauigkeit um das Zehnfache erhöht:
8,80*1000*12/1000
Ergebnis: 105,6
Es ist normal.
16,40 * 1000000 * 6 / 1000000
Es gibt auch ein Problem mit dem Ergebnis
Um die Ausführung von js genauer zu machen, erweitern Sie in der zukünftigen js-Dezimalberechnung den Wert direkt um das 10.000-fache und dividieren Sie ihn dann durch 10.000, um das Problem zu lösen.
Varnum = 38,80;
var num2 = 13;
alarm(num * 10000 * 12 / 10000);
Die zu multiplizierende und zu dividierende Zahl wurde getestet und beträgt 10.000. Wenn sie kleiner ist, verursachen einige Zahlen Probleme. Wenn sie größer ist (1.000.000), verursachen einige Zahlen ebenfalls Probleme.
zwei,
Kopieren Sie den Codecode wie folgt:
<script defer>
Number.prototype.rate=function(){
varoStr=this.toString();
if(oStr.indexOf(".")==-1)
return1;
anders
returnMath.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1));
}
functiontran(){
args=tran.arguments;
vartemp=1;
for(i=0;i<args.length;i++)
temp*=args[i]*args[i].rate();
for(i=0;i<args.length;i++)
temp/=args[i].rate();
Rücklauftemp
}
alarm(tran(11,22.9));
</script>
Diese Lösung ist etwas umständlicher, gibt Ihnen aber eine Vorstellung vom tatsächlichen Lösungsprozess dieses Problems.
Kopieren Sie den Codecode wie folgt:
//Divisionsfunktion, wird verwendet, um genaue Divisionsergebnisse zu erhalten
//Hinweis: Das Divisionsergebnis von JavaScript weist Fehler auf, die bei der Division zweier Gleitkommazahlen deutlicher werden. Diese Funktion gibt ein genaueres Divisionsergebnis zurück.
//Aufruf: accDiv(arg1,arg2)
//Rückgabewert: das genaue Ergebnis der Division von arg1 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){}
with(Mathe){
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
}
}
// Fügen Sie dem Zahlentyp eine div-Methode hinzu, um den Aufruf zu vereinfachen.
Number.prototype.div = function (arg){
return accDiv(this, arg);
}
//Multiplikationsfunktion, die verwendet wird, um genaue Multiplikationsergebnisse zu erhalten
//Hinweis: Das Multiplikationsergebnis von JavaScript weist Fehler auf, die deutlicher sichtbar werden, wenn zwei Gleitkommazahlen multipliziert werden. Diese Funktion gibt ein genaueres Multiplikationsergebnis zurück.
//Aufruf: accMul(arg1,arg2)
//Rückgabewert: das genaue Ergebnis der Multiplikation von arg1 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+=s2.split(".")[1].length}catch(e){}
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}
// Fügen Sie dem Number-Typ eine mul-Methode hinzu, um den Aufruf zu vereinfachen.
Number.prototype.mul = function (arg){
return accMul(arg, this);
}
// Additionsfunktion, die verwendet wird, um genaue Additionsergebnisse zu erhalten
//Hinweis: Das Additionsergebnis von JavaScript weist Fehler auf, die beim Addieren zweier Gleitkommazahlen deutlicher werden. Diese Funktion gibt ein genaueres Additionsergebnis zurück.
//Aufruf: accAdd(arg1,arg2)
// Rückgabewert: das genaue Ergebnis von arg1 plus arg2
Funktion accAdd(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}
m=Math.pow(10,Math.max(r1,r2))
return (arg1*m+arg2*m)/m
}
// Fügen Sie dem Nummerntyp eine Add-Methode hinzu, um den Aufruf zu vereinfachen.
Number.prototype.add = function (arg){
return accAdd(arg,this);
}