js 數值精確運算使用math.js


javaScript 浮點數運算的精度問題

 

問題:編程中你可能會遇到0.1*7=0.7000000000000001;

 

原因:幾乎所有的編程語言都采用了 IEEE-745 浮點數表示法,任何使用二進制浮點數的編程語言都會有這個問題,只不過在很多其他語言中已經封裝好了方法來避免精度的問題,而 JavaScript 是一門弱類型的語言,從設計思想上就沒有對浮點數有個嚴格的數據類型,所以精度誤差的問題就顯得格外突出。

 

解決: 

1.對於普通數據計算可以用 toFix(2)截取;

2. 常用方法: 把需要計算的數字升級(乘以10的N次冪)成計算機能夠識別的整數,等計算完畢后再降級(除以10的N次冪),這是大部分變成語言處理經度差異的通用方法;

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 );
}
 

3.對於金額這種要求嚴格的經度計算推薦使用math.js:

http://mathjs.org/examples/bignumbers.js.html

math.config({ number: 'BigNumber', // Default type of number: // 'number' (default), 'BigNumber', or 'Fraction' precision: 20 // Number of significant digits for BigNumbers });


參考文獻:http://mathjs.org/examples/bignumbers.js.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM