JS 浮点计算BUG

最近做项目的时候遇到一个比较纠结的js浮点计算问题。

当时是做利率计算,因为利率大多数涉及到小数点,精度要求也很高。

0.6+0.1+0.1=?

结果出现:0.7999999999999

网上查找了一下,这确实是一个缺陷(Bug)

不仅加,只要涉及到浮点计算减成除一样会出现类似情况

先看看Demo:

将0.1~10,加0.1+0.1  进行测试

1         $(function () {
2             var content = "";
3             for (var i = 0.1; i <= 10; i += 0.1) {
4                 var result = i + 0.1 + 0.1;
5                 content = content + result + '\t';
6             }
7             alert(content);
8         });

 

运行结果:

 

解决方法:

根据tofixed方法,我们修改一下,修改一个toRound方法,可对小数点精准四舍五入:

 1         Number.prototype.toRound = function(d)
 2         {
 3             var s=this+"";if(!d)d=0;
 4             if(s.indexOf(".")==-1)s+=".";s+=new Array(d+1).join("0");
 5             if (new RegExp("^(-|\\+)?(\\d+(\\.\\d{0,"+ (d+1) +"})?)\\d*$").test(s))
 6             {
 7                 var s="0"+ RegExp.$2, pm=RegExp.$1, a=RegExp.$3.length, b=true;
 8                 if (a==d+2){a=s.match(/\d/g); if (parseInt(a[a.length-1])>4)
 9                 {
10                     for(var i=a.length-2; i>=0; i--) {a[i] = parseInt(a[i])+1;
11                         if(a[i]==10){a[i]=0; b=i!=1;} else break;}
12                 }
13                     s=a.join("").replace(new RegExp("(\\d+)(\\d{"+d+"})\\d$"),"$1.$2");
14                 }if(b)s=s.substr(1);return (pm+s).replace(/\.$/, "");} return this+"";
15         };   

改一下Demo中的方法,调用toRound方法:

    var result = (i+0.1+0.1).toRound(2);

结果:

 


 

  

 

posted @ 2015-11-27 17:44  虔城墨客  阅读(1457)  评论(2编辑  收藏  举报