引: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>