码迷,mamicode.com
首页 > Web开发 > 详细

JS 浮点计算BUG

时间:2015-11-27 19:17:32      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

最近做项目的时候遇到一个比较纠结的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);

结果:

 技术分享


 

  

 

JS 浮点计算BUG

标签:

原文地址:http://www.cnblogs.com/yangda/p/5001278.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!