關於BigDecimal的使用

爲何使用BigDecimal編程

使用BigDecimal首先要注意到float,double是沒法支持商業計算的。只能支持工程計算。即偏差容許的計算。一般float佔用4個字節,32位。double佔用8個字節,64位。  app

float f=1.1f;編程語言

double d=1.1; //1.1d的d能夠省略,平時用的最多的也是double。可是一旦涉及到計算的時候,問題出現this

float f=1.1; //會警告精度有損失。由於是將double賦給了float,精度範圍變小spa

System.out.println(5.1+1.1);//輸出並非6.2,而是6.19999999999999999. 若是通過循環計算偏差就會逐漸放大。excel

推薦的辦法就是計算的過程使用BigDecimal,BigDecimal是支持超大小數,同時支持精確計算。Java中的簡單浮點數類型float和double不可以進行運算。不光是Java,在其它不少編程語言中也有這樣的問題。這個問題至關嚴重,若是你有9.999999999999元,你的計算機是不會認爲你能夠購買10元的商品的。   
  在有的編程語言中提供了專門的貨幣類型來處理這種狀況ci

 Note:   the   results   of   this   constructor   can   be   somewhat   unpredictable.   One   might   assume   that   new   BigDecimal(.1)   is   exactly   equal   to   .1,   but   it   is   actually   equal   to   .1000000000000000055511151231257827021181583404541015625.   This   is   so   because   .1   cannot   be   represented   exactly   as   a   double   (or,   for   that   matter,   as   a   binary   fraction   of   any   finite   length).   Thus,   the   long   value   that   is   being   passed   in   to   the   constructor   is   not   exactly   equal   to   .1,   appearances   nonwithstanding.     
  The   (String)   constructor,   on   the   other   hand,   is   perfectly   predictable:   new   BigDecimal(".1")   is   exactly   equal   to   .1,   as   one   would   expect.   Therefore,   it   is   generally   recommended   that   the   (String)   constructor   be   used   in   preference   to   this   one.   
    
  原來咱們若是須要精確計算,非要用String來夠造BigDecimal不可!在《Effective   Java》一書中的例子是用String來夠造BigDecimal的,可是書上卻沒有強調這一點,這也許是一個小小的失誤吧。   如今咱們已經能夠解決這個問題了,原則是使用BigDecimal而且必定要用String來夠造。it

BigDecimal bd=new BigDecimal("5.1");io

System.out.println(bd);//值輸出仍然是5.1,這是下一步利用BigDeciaml進行商業計算的基礎。table

 

有些第三方的類,好比普元在excel導入時,最終賦給BigDecimal失去精度的值。

估計是直接利用new BigDecimal(double value)賦給類的BigDecimal屬性。

解決的辦法是不使用Double構造BigDecimal,而直接使用Double。Double能夠在導入或讀取時使用,到了計算的時候,可使用BigDecimal。

若是是本身寫Excel導入確定會避免這樣的問題,即便使用BigDecimal也沒有問題。

相關文章
相關標籤/搜索