JavaScript四則運算精度丟失解決方案

轉載於: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);
    }
}
相關文章
相關標籤/搜索