Eine genaue Berechnung ist für ein Projekt von entscheidender Bedeutung. Wie erreicht man also eine genaue Berechnung arithmetischer Operationen in js? Der folgende Artikel wird Ihnen die genaue Berechnung vorstellen, die von js implementiert wurde.
Fehler, dass JS keine genauen Berechnungen durchführen kann
Bei der Arbeit an der CRM-Seite mit den Überprüfungsanforderungen der zweiten Generation. Die vom Benutzer eingegebenen Zahlen müssen im Verhältnis an verschiedenen Stellen angezeigt werden (das Backend übergibt eine Dezimalzahl wie 0,8).
Bei der Operation dubheInvest = invest * (1 - ratio); wurde ein Problem festgestellt. Die Details lauten wie folgt:
Beispielcode:
console.log( 1 - 0.8 ); //输出 0.19999999999999996 console.log( 6 * 0.7 ); //输出 4.199999999999999 console.log( 0.1 + 0.2 ); //输出 0.30000000000000004 console.log( 0.1 + 0.7 ); //输出 0.7999999999999999 console.log( 1.2 / 0.2 ); //输出 5.999999999999999
Wie Sie den obigen Beispielen entnehmen können, sind die Ergebnisse der nativen js-Operation möglicherweise nicht genau und verlieren an Präzision.
Lösung
Das Prinzip der Lösung besteht darin, die Gleitkommazahl mit 10 auf die n-te Potenz zu multiplizieren (zu erweitern), die Gleitkommazahl in eine Ganzzahl umzuwandeln und dann die entsprechende Operation auszuführen und schließlich zu erhalten Das Ergebnis: Teilen (reduzieren) Sie 10 in die n-te Potenz.
Prinzipbeispiel:
Ändern Sie console.log(1-0.8); in console.log((1 * 10 - 0.8 * 10) / 10); um den richtigen Wert zu erhalten
Basierend auf Mithilfe der oben genannten Prinzipien können einige Methoden gekapselt werden, um solche Probleme zu lösen. Wie unten gezeigt (Math.pow(x, y); bedeutet das Finden von x hoch y):
//加法运算 function floatAdd(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; } //减法运算 function floatSub(arg1,arg2){ var r1,r2,m,n; 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)); //动态控制精度长度 n=(r1>=r2)?r1:r2; return ((arg1*m-arg2*m)/m).toFixed(n); } //乘法运算 function floatMul(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); } //除法运算 function floatp(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){} r1=Number(arg1.toString().replace(".","")); r2=Number(arg2.toString().replace(".","")); return (r1/r2)*Math.pow(10,t2-t1); }
Verwandte Empfehlungen:
js präzise Addition, Subtraktion, Multiplikation und Divisionsbeispiele
Das obige ist der detaillierte Inhalt vonjs implementiert die präzise Berechnung arithmetischer Operationen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!