爲何使用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也沒有問題。