在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>
执行结果如图