Heim  >  Artikel  >  Web-Frontend  >  js implementiert die präzise Berechnung arithmetischer Operationen

js implementiert die präzise Berechnung arithmetischer Operationen

不言
不言Original
2018-07-17 15:55:056869Durchsuche

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn