JS操作小數運算,結果莫名其妙出現多位小數問題

來源:互聯網
上載者:User

標籤:

Number類型:

Number類型是ECMAScript中最常用和最令人關注的類型了;這種類型使用IEEE754格式來表示整數和浮點數值(浮點數值在某些語言中也被成為雙精確度數值),為支援各種資料類型,ECMA-262定義了不同的數值面量格式。

十進位:

var intNum=10; //整數

八進位:

var octalNum1=070; //八進位的56

var octalNum2=079; //無效的八位元值-解析為79

 

八進位字面量在strict 模式下是無效的;

十六進位:

var hexNum1=0xA; //10

切記:在進行運算的時候,所有以八進位和十六進位表示的數值都最終被轉換成十進位;

為什麼操作小數會出現誤差?

浮點數值的最高進度是17位小數,但在進行運算的時候其精確度卻遠遠不如整數;整數在進行運算的時候都會轉成10進位; 而java和JavaScript中計算小數運算時,都會先將十進位的小數換算到對應的二進位,一部分小數並不能完整的換算為二進位,這裡就出現了第一次的誤差。待小數都換算為二進位後,再進行二進位間的運算,得到二進位結果。然後再將二進位結果換算為十進位,這裡通常會出現第二次的誤差。

所以(0.1+0.2)!=03

解決方式:

程式碼
除法函數,用來得到精確的除法結果
說明:javascript的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函數返回較為精確的除法結果。
調用:accDiv(arg1,arg2)
傳回值:arg1除以arg2的精確結果

function accDiv(arg1,arg2){    var t1=0,t2=0,r1,r2;    try{  <span style="font-family:simsun;">   </span>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(".",""))    <span style="font-family:simsun;">   </span>return (r1/r2)*pow(10,t2-t1);  }  <span style="font-family:simsun;">   </span>}  

  給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  )}  
View Code

 

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

Number.prototype.mul = function (arg){    return accMul(arg, this);  }  
View Code加法函數,用來得到精確的加法結果

說明: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  }  
View Code

 

給Number類型增加一個add方法,調用起來更加方便。
Number.prototype.add = function (arg){    return accAdd(arg,this);  }  
View Code

在你要用的地方包含這些函數,然後調用它來計算就可以了。
  比如你要計算:7*0.8 ,則改成 (7).mul(8) 
  其它運算類似,就可以得到比較精確的結果。

 

解決方式二:

比較常用的辦法,toFixed(),toFixed() 方法可把 Number 四捨五入為指定小數位元的數字。在我們計算的結果後面加上這個方法就OK了;但是對精度會有一絲影響,如果精度要求不高的話推薦使用;

 

JS操作小數運算,結果莫名其妙出現多位小數問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.