引:alert(0.1 + 0.2 == 0.3); // false
javascript
分析:浮点数值在js里存储的最高精度为17位小数,因此0.1+0.2=0.30000000000000004而不是0.3,实际上全部基于IEEE754的浮点计算都会存在偏差,ECMAScript并不是独此一家。java
解决:将js的浮点计算转换为整型数值计算,如上能够用 (0.1*10 + 0.2*10)/10 = 0.3 来表示。this
具体实现以下:prototype
<script type="text/javascript"> // 两个浮点数求和 function accAdd(num1,num2){ var r1,r2,m; try{ r1 = num1.toString().split('.')[1].length; }catch(e){ r1 = 0; } try{ r2=num2.toString().split(".")[1].length; }catch(e){ r2=0; } m=Math.pow(10,Math.max(r1,r2)); return Math.round(num1*m+num2*m)/m; } // 两个浮点数相减 function accSub(num1,num2){ var r1,r2,m; try{ r1 = num1.toString().split('.')[1].length; }catch(e){ r1 = 0; } try{ r2=num2.toString().split(".")[1].length; }catch(e){ r2=0; } m=Math.pow(10,Math.max(r1,r2)); n=(r1>=r2)?r1:r2; return (Math.round(num1*m-num2*m)/m).toFixed(n); } // 两数相除 function accDiv(num1,num2){ var t1,t2,r1,r2; try{ t1 = num1.toString().split('.')[1].length; }catch(e){ t1 = 0; } try{ t2=num2.toString().split(".")[1].length; }catch(e){ t2=0; } r1=Number(num1.toString().replace(".","")); r2=Number(num2.toString().replace(".","")); return (r1/r2)*Math.pow(10,t2-t1); } //乘法 function accMul(num1,num2){ var m=0,s1=num1.toString(),s2=num2.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); } //给Number对象的原型增长方法,调用起来更加方便。 Number.prototype.add = function (arg) { return accAdd(arg, this); }; Number.prototype.sub = function (arg) { return accSub(arg, this); }; Number.prototype.mul = function (arg) { return accMul(arg, this); }; Number.prototype.div = function (arg) { return accDiv(arg, this); }; </script>