JS 浮点计算BUG

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

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

0.6+0.1+0.1=?

结果出现:0.7999999999999

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

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

先看看Demo:

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

         $(function () {
var content = "";
for (var i = 0.1; i <= 10; i += 0.1) {
var result = i + 0.1 + 0.1;
content = content + result + '\t';
}
alert(content);
});

运行结果:

JS 浮点计算BUG

解决方法:

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

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

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

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

结果:

 JS 浮点计算BUG


 

  

上一篇:svn同步小脚本


下一篇:win7虚拟机起不来,报错transport vmdb error -44 message the vmware authorization