Heim > Web-Frontend > js-Tutorial > So lösen Sie das Problem der Präzision von js-Gleitkommazahlen

So lösen Sie das Problem der Präzision von js-Gleitkommazahlen

一个新手
Freigeben: 2017-09-25 10:34:06
Original
1692 Leute haben es durchsucht

Die meisten Sprachen werden beim Umgang mit Gleitkommazahlen auf Präzisionsprobleme stoßen, aber in JS scheint es besonders schwerwiegend zu sein

alert(45.6*13); 🎜>Ergebnis: Es ist tatsächlich 592,800000000001. Natürlich wird dieses Problem auch bei Additionen und dergleichen auftreten.
Ist das ein js-Fehler?
Natürlich nicht, Ihr Computer führt binäre Gleitkommaoperationen aus, aber das Problem besteht darin, dass Sie Dezimalzahlen eingeben und der Computer im Binärformat arbeitet. Die beiden werden nicht immer so gut konvertiert, und manchmal erhalten Sie das richtige Ergebnis Manchmal hat man nicht so viel Glück
alert(0.7+0.1);//Ausgabe 0.7999999999999999
alert(0.6+0.2);//Ausgabe 0.8

Sie geben zwei ein, wenn Dezimalzahlen in Binärzahlen umgewandelt werden und dann zurückkonvertiert, kommt es natürlich zu Verlusten während des Konvertierungsprozesses

Allgemeine Verluste treten jedoch eher bei Multiplikations- und Divisionsoperationen auf, und JS tritt auch bei einfachen Additionen und Subtraktionen auf. Wie Sie sehen, ist dieser Fehler das Problem ist auch sehr klein, aber es sollte nicht vorkommen
Wie kann man es also lösen? ECMA4 scheint eine Lösung zu haben, aber es ist jetzt nicht so praktisch
, wie 0,7+0,1, multiplizieren Sie zuerst sowohl 0,1 als auch 0,7 mit 10, und dann durch 10 dividieren
Darüber hinaus können Sie einige Funktionen schreiben, um dieses Problem zu lösen. Sie sollten auf Baidu und Google suchen, um viele zu finden, aber es ist am besten, JS nicht zu verwenden. Führen Sie einige komplexe Gleitkommazahlen aus Operationen, schließlich ist JS hier nicht nützlicher

<script type="text/javascript">  

    // 两个浮点数求和  
    function accAdd(num1,num2){  
       var r1,r2,m;  
       try{  
           r1 = num1.toString().split(&#39;.&#39;)[1].length;  
       }catch(e){  
           r1 = 0;  
       }  
       try{  
           r2=num2.toString().split(".")[1].length;  
       }catch(e){  
           r2=0;  
       }  
       m=Math.pow(10,Math.max(r1,r2));  
       // return (num1*m+num2*m)/m;  
       return Math.round(num1*m+num2*m)/m;  
    }  

    // 两个浮点数相减  
    function accSub(num1,num2){  
       var r1,r2,m;  
       try{  
           r1 = num1.toString().split(&#39;.&#39;)[1].length;  
       }catch(e){  
           r1 = 0;  
       }  
       try{  
           r2=num2.toString().split(".")[1].length;  
       }catch(e){  
           r2=0;  
       }  
       m=Math.pow(10,Math.max(r1,r2));  
       n=(r1>=r2)?r1:r2;  
       return (Math.round(num1*m-num2*m)/m).toFixed(n);  
    }  
    // 两数相除  
    function accp(num1,num2){  
       var t1,t2,r1,r2;  
       try{  
           t1 = num1.toString().split(&#39;.&#39;)[1].length;  
       }catch(e){  
           t1 = 0;  
       }  
       try{  
           t2=num2.toString().split(".")[1].length;  
       }catch(e){  
           t2=0;  
       }  
       r1=Number(num1.toString().replace(".",""));  
       r2=Number(num2.toString().replace(".",""));  
       return (r1/r2)*Math.pow(10,t2-t1);  
    }  

    function accMul(num1,num2){  
       var m=0,s1=num1.toString(),s2=num2.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);  
    }  

  </script>  

    <script>  
    document.write("使用js原生态方法");  
    document.write("<br/> 1.01 + 1.02 ="+(1.01 + 1.02));  
    document.write("<br/> 1.01 - 1.02 ="+(1.01 - 1.02));  
    document.write("<br/> 0.000001 / 0.0001 ="+(0.000001 / 0.0001));  
    document.write("<br/> 0.012345 * 0.000001 ="+(0.012345 * 0.000001));  
    document.write("<br/><hr/>");  
    document.write("<br/>使用自定义方法");  
    document.write("<br/> 1.01 + 1.02 ="+accAdd(1.01,1.02));  
    document.write("<br/> 1.01 - 1.02 ="+accSub(1.01,1.02));  
    document.write("<br/> 0.000001 / 0.0001 ="+accp(0.000001,0.0001));  
    document.write("<br/> 0.012345 * 0.000001 ="+accMul(0.012345,0.000001));  
    </script>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der Präzision von js-Gleitkommazahlen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage