要想没有误差,只有用字符串的形式转化整数来运算,用这个函数代替
<script language=javascript>
function jjcc(v1,v2,n,typ){
/*
v1 v2 是两个操作数
n 是最大小数位数 一定要大于等于两个操作数的小数位数 否则会出异常
也可以在这里把最大小数位数改为自动判断
type 是类型 'add' 加 'min' 减 'mul' 乘
*/
var s1=Number(v1.toFixed(n).replace(".",""));
var s2=Number(v2.toFixed(n).replace(".",""));
if(typ=='add'){
var ret=String(s1+s2);
return Number(ret.substring(0,ret.length-n)+"."
+ret.substring(ret.length-n));
}else if(typ=='min'){
var ret=String(s1-s2);
return Number(ret.substring(0,ret.length-n)+"."
+ret.substring(ret.length-n));
}else if(typ=='mul'){
var ret=String(s1*s2);
return Number(ret.substring(0,ret.length-2*n)+"."
+ret.substring(ret.length-2*n));
}
}
alert(jjcc(1038.1,1000,1,"add")+" "+(1038.1+1000)+"\n"
+jjcc(1038.1,1000,1,"min")+" "+(1038.1-1000)+"\n"
+jjcc(1038.1,1000,1,"mul")+" "+(1038.1*1000));
</script>
<script language=javascript>
function jjcc(v1,v2,n,typ){
/*
v1 v2 是两个操作数
n 是最大小数位数 一定要大于等于两个操作数的小数位数 否则会出异常
也可以在这里把最大小数位数改为自动判断
type 是类型 'add' 加 'min' 减 'mul' 乘
*/
var s1=Number(v1.toFixed(n).replace(".",""));
var s2=Number(v2.toFixed(n).replace(".",""));
if(typ=='add'){
var ret=String(s1+s2);
return Number(ret.substring(0,ret.length-n)+"."
+ret.substring(ret.length-n));
}else if(typ=='min'){
var ret=String(s1-s2);
return Number(ret.substring(0,ret.length-n)+"."
+ret.substring(ret.length-n));
}else if(typ=='mul'){
var ret=String(s1*s2);
return Number(ret.substring(0,ret.length-2*n)+"."
+ret.substring(ret.length-2*n));
}
}
alert(jjcc(1038.1,1000,1,"add")+" "+(1038.1+1000)+"\n"
+jjcc(1038.1,1000,1,"min")+" "+(1038.1-1000)+"\n"
+jjcc(1038.1,1000,1,"mul")+" "+(1038.1*1000));
</script>
alert(jjcc(1.1,1.1,1,"mul"));
如果小数点位数不一致取最大值
alert(jjcc(1.1,1.56,2,"mul"));
好像javascript,计算某些数字时会出现类似情况。比如像0.2*0.3。
一般做法先把小数乘以10,计算后再除以10。