淺析js中的浮點型運算問題

來源:互聯網
上載者:User

淺析js中的浮點型運算問題

 本篇文章主要是對js中浮點型運算的問題進行了介紹,需要的朋友可以過來參考下,希望對大家有所協助

js中浮點型是如何運算的呢?

 

例如:var a=0.69;

 

我想得到6.9 直接這樣寫 var c=a*10;

 

alert(c);   得到結果是:6.8999999999999995

 

到網上一搜,有網友說這是一個JS浮點數運算Bug,找瞭解決方法:

 

方法一:有js自訂函數

代碼如下:

<script>

 

//加法函數,用來得到精確的加法結果 

//說明:javascript的加法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函數返回較為精確的加法結果。 

//調用:accAdd(arg1,arg2) 

//傳回值:arg1加上arg2的精確結果 

function accAdd(arg1,arg2){ 

var r1,r2,m; 

try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} 

try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} 

m=Math.pow(10,Math.max(r1,r2)) 

return (arg1*m+arg2*m)/m 

//給Number類型增加一個add方法,調用起來更加方便。 

Number.prototype.add = function (arg){ 

return accAdd(arg,this); 

}

 

//加法函數,用來得到精確的加法結果 

//說明:javascript的加法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函數返回較為精確的加法結果。 

//調用:accAdd(arg1,arg2) 

//傳回值:arg1加上arg2的精確結果 

function accSub(arg1,arg2){

    var r1,r2,m,n;

    try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}

    try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}

    m=Math.pow(10,Math.max(r1,r2));

    //last modify by deeka

    //動態控制精度長度

    n=(r1>=r2)?r1:r2;

    return ((arg1*m-arg2*m)/m).toFixed(n);

}

 

//除法函數,用來得到精確的除法結果 

//說明:javascript的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函數返回較為精確的除法結果。 

//調用:accDiv(arg1,arg2) 

//傳回值:arg1除以arg2的精確結果 

function accDiv(arg1,arg2){ 

var t1=0,t2=0,r1,r2; 

try{t1=arg1.toString().split(".")[1].length}catch(e){} 

try{t2=arg2.toString().split(".")[1].length}catch(e){} 

with(Math){ 

r1=Number(arg1.toString().replace(".","")) 

r2=Number(arg2.toString().replace(".","")) 

return (r1/r2)*pow(10,t2-t1); 

//給Number類型增加一個div方法,調用起來更加方便。 

Number.prototype.div = function (arg){ 

return accDiv(this, arg); 

 

//乘法函數,用來得到精確的乘法結果 

//說明:javascript的乘法結果會有誤差,在兩個浮點數相乘的時候會比較明顯。這個函數返回較為精確的乘法結果。 

//調用:accMul(arg1,arg2) 

//傳回值:arg1乘以arg2的精確結果 

function accMul(arg1,arg2) 

var m=0,s1=arg1.toString(),s2=arg2.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類型增加一個mul方法,調用起來更加方便。 

Number.prototype.mul = function (arg){ 

return accMul(arg, this); 

 

var a=0.69;

var b=10;

alert(a*b);//6.8999999999999995

alert((a*100)/10);

</script>

 

 

直接調用函數就可以。

 

方法二:如果在知道小數位個數的前提下,可以考慮通過將浮點數放大倍數到整型(最後再除以相應倍數),再進行運算操作,這樣就能得到正確的結果了

 

alert(11*22.9);//得到251.89999999999998

alert(11*(22.9*10)/10);//得到251.9

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.