最新消息:www.yxkong.com也可以访问

js运算精度

web前端 yxkong 1039浏览 1评论

今天测试系统的时候,发现前端js运算的不正确,转了又转,发现都不行,如下

百度了下,发现是javascript浮点运算的一个bug

解决方法一

使用javascript中自带的方法toFixed()修复
  NumberObject.toFixed(num)
  toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。
  这种方法知道只能是在已知小数位数的时候使用,不小的位数的时候傻了

解决方法二

  将浮点数转成整数,再做运算

  

//浮点数相加
function dcmAdd(arg1,arg2){
    var r1,r2,m;
    try{r1=arg1.toString().split(".")[1].length;}catch(e){r1=0;}
    try{r2=arg2.toString().split(".")[1].length;}catch(e){r2=0;}
    m=Math.pow(10,Math.max(r1,r2));
    return (dcmMul(arg1,m)+dcmMul(arg2,m))/m;
}
//浮点数相减
function dcmSub(arg1,arg2){
     return dcmAdd(arg1,-arg2);
}
//浮点数相乘
function dcmMul(arg1,arg2){
    var m=0,s1=arg1.toString(),s2=arg2.toString();
    try{m+=s1.split(".")[1].length;}catch(e){}
    try{m+=s2.split(".")[1].length;}catch(e){}
    return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
}
//浮点数除
function dcmDiv(arg1,arg2){
    return dcmMul(arg1,1/arg2);
}
Number.prototype.add = function (arg){
                   return dcmAdd(this, arg);
}
Number.prototype.sub = function (arg){
                   return dcmSub(this, arg);
}
Number.prototype.mul = function (arg){
                   return dcmMul(this, arg);
}
Number.prototype.div = function (arg){
                   return dcmDiv(this, arg);
}

解决方法三

通过分割浮点,将其分割成对应的整数做运算,然后再拼接起来

转载请注明:我要编程 » js运算精度

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 楼主,是你让我深深地理解了‘人外有人,天外有天’这句话。谢谢侬!
    匿名7年前 (2014-10-23)回复