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);
结果: