Heim >Web-Frontend >js-Tutorial >So lösen Sie das Problem der Präzision von js-Gleitkommazahlen
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
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('.')[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('.')[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('.')[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>
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!