js中小數運算精度丟失問題
阿新 • • 發佈:2019-01-29
在js中做一些計算的時候,如果直接計算有可能造成精度丟失,比如在計算1.79 + 0.12的時候,直接計算的結果就是1.9100000000000001,但是我們知道正確的計算結果應該1.91.我的解決辦法如下(直接放程式碼)
<html>
<body>
<input type="button" name="name" value="xxxx" onclick="test()"/>
</body>
<script language="javascript">
function add(num1,num2){
var r1 ,r2,m,n;
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 ((num1*m + num2*m)/m).toFixed(n);
}
function sub (num1,num2){
var r1,r2,m,n;
try{r1=num1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=num2.toString().split(".")[1].length}catch(e){r2=0}
n = (r1>=r2)?r1:r2;
m = Math.pow(10,Math.max(r1,r2));
return ((num1*m - num2*m)/m).toFixed (n);
}
function mul(num1,num2){
var m = 0;
try{m+=num1.toString().split(".")[1].length}catch(e){}
try{m+=num2.toString().split(".")[1].length}catch(e){}
return (Number(num1.toString().replace(".",""))*Number(num2.toString().replace(".","")))/Math.pow(10,m)
}
function div(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);
}
function test(){
var _add = 1.79 + 0.12;
var _add2 = add(1.79,0.12);
var _sub = 2.01 - 0.12;
var _sub2 = sub(2.01,0.12);
var _mul = 1.01 * 1.3;
var _mul2 = mul(1.01,1.3);
var _div = 0.69 / 10;
var _div2 = div(0.69,10);
alert("加法:處理前1.79 + 0.12 = " +_add + " 處理後 1.79 + 0.12 = " + _add2 + "\n" +
"減法:處理前2.01 - 0.12 = " +_sub + " 處理後 2.01 - 0.12 = " + _sub2 + "\n" +
"乘法:處理前1.01 * 1.3 = " +_mul + " 處理後 1.01 * 1.3 = " + _mul2 + "\n" +
"除法:處理前0.69 / 10 = " +_div + " 處理後 0.69 / 10 = " + _div2 + "\n"
);
}
</script>
</html>
執行結果如圖