轉載於:http://jiangzhengjun.iteye.com/blog/458869javascript
JavaScript小數在作四則運算時,精度會丟失,這會在項目中引發諸多不便,先請看下面腳本:java
<script type="text/javascript" language="javascript"> alert(1/3);//彈出: 0.3333333333333333 alert(0.09999999 + 0.00000001);//彈出: 0.09999999999999999 alert(-0.09999999 - 0.00000001);//彈出: -0.09999999999999999 alert(0.012345 * 0.000001);//彈出: 1.2344999999999999e-8 alert(0.000001 / 0.0001);//彈出: 0.009999999999999998 </script>
按正常計算的話,除第一行外(由於其自己就不能除盡),其餘都應該要獲得精確的結果,從彈出的結果咱們卻發現不是咱們想要的正確結果。爲了解決浮點數運算不許確的問題,在運算前咱們把參加運算的數先升級(10的X的次方)到整數,等運算完後再降級(0.1的X的次方)。現收集並整理貼於此,以備後用。this
//加法 Number.prototype.add = function(arg){ var r1,r2,m; try{r1=this.toString().split(".")[1].length}catch(e){r1=0} try{r2=arg.toString().split(".")[1].length}catch(e){r2=0} m=Math.pow(10,Math.max(r1,r2)) return (this*m+arg*m)/m } //減法 Number.prototype.sub = function (arg){ return this.add(-arg); } //乘法 Number.prototype.mul = function (arg) { var m=0,s1=this.toString(),s2=arg.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.prototype.div = function (arg){ var t1=0,t2=0,r1,r2; try{t1=this.toString().split(".")[1].length}catch(e){} try{t2=arg.toString().split(".")[1].length}catch(e){} with(Math){ r1=Number(this.toString().replace(".","")) r2=Number(arg.toString().replace(".","")) return (r1/r2)*pow(10,t2-t1); } }