js中Number数字数值运算后值不对的解决⽅法问题:
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
}
//给Number类型增加⼀个add⽅法,调⽤起来更加⽅便。
Number.prototype.add = function (arg){
return accAdd(arg,this);
}
减法函数
function accSub(arg1, arg2) {
var r1, r2, m, n;
try { r1 = String().split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = String().split(".")[1].length } catch (e) { r2 = 0 }
m = Math.pow(10, Math.max(r1, r2));
//last modify by deeka
//动态控制精度长度
javascript说明n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
}
在你要⽤的地⽅包含这些函数,然后调⽤它来计算就可以了。
⽐如你要计算:7*0.8 ,则改成 (7).mul(8)
其它运算类似,就可以得到⽐较精确的结果。
以上这篇js中Number数字数值运算后值不对的解决⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论