解决JS浮点数运算出现Bug的⽅法
37.5*5.5=206.08 (JS算出来是这样的⼀个结果,我四舍五⼊取两位⼩数)
我先怀疑是四舍五⼊的问题,就直接⽤JS算了⼀个结果为:206.08499999999998
怎么会这样,两个只有⼀位⼩数的数字相乘,怎么可能多出这么⼩数点出来。
我Google了⼀下,发现原来这是JavaScript浮点运算的⼀个bug。
⽐如:7*0.8 JavaScript算出来就是:5.6000000000000005
⽹上到了⼀些解决办法,就是重新写了⼀些浮点运算的函数或直接扩⼤倍数运算。
下⾯就把这些⽅法摘录下来,以供遇到同样问题的朋友参考:
复制代码代码如下:
//除法函数,⽤来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会⽐较明显。这个函数返回较为精确的除法结果。//调⽤:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1,arg2){
var t1=0,t2=0,r1,r2;
try{String().split(".")[1].length}catch(e){}
try{String().split(".")[1].length}catch(e){}
with(Math){
r1=String().replace(".",""))
r2=String().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
}
}
/
/给Number类型增加⼀个div⽅法,调⽤起来更加⽅便。
Number.prototype.div = function (arg){
return accDiv(this, arg);
}
//乘法函数,⽤来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会⽐较明显。这个函数返回较为精确的乘法结果。//调⽤:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
function accMul(arg1,arg2)
{
var m=0,String(),String();
try{m+=s1.split(".")[1].length}catch(e){}
try{m+=s2.split(".")[1].length}catch(e){}
return place(".",""))*place(".",""))/Math.pow(10,m)
}
//给Number类型增加⼀个mul⽅法,调⽤起来更加⽅便。
Number.prototype.mul = function (arg){
return accMul(arg, this);
}
//加法函数,⽤来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会⽐较明显。这个函数返回较为精确的加法结果。//调⽤:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
function accAdd(arg1,arg2){
var r1,r2,m;
try{String().split(".")[1].length}catch(e){r1=0}
try{String().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
return (arg1*m+arg2*m)/m
}
javascript说明//给Number类型增加⼀个add⽅法,调⽤起来更加⽅便。
Number.prototype.add = function (arg){
return accAdd(arg,this);
}
//减法函数,⽤来得到精确的减法结果
/
/说明:javascript的减法结果会有误差,在两个浮点数相加的时候会⽐较明显。这个函数返回较为精确的减法结果。
//调⽤:accSubtr(arg1,arg2)
//返回值:arg1减去arg2的精确结果
function accSubtr(arg1,arg2){
var r1,r2,m,n;
try{String().split(".")[1].length}catch(e){r1=0}
try{String().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2));
//动态控制精度长度
n=(r1>=r2)?r1:r2;
return ((arg1*m-arg2*m)/m).toFixed(n);
}
//给Number类型增加⼀个subtr ⽅法,调⽤起来更加⽅便。
Number.prototype.subtr = function (arg){
return accSubtr(arg,this);
}
在你要⽤的地⽅包含这些函数,然后调⽤它来计算就可以了。
/如果在知道⼩数位个数的前提下,可以考虑通过将浮点数放⼤倍数到整型(最后再除以相应倍数),再进⾏运算操作,这样就能得到正确的结果了
复制代码代码如下:
<script>
alert(11*(22.9*10)/10);
</script>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论