1. 程式人生 > >java處理高精度的商業計算

java處理高精度的商業計算

在公司寫程式碼時,發現從mongodb中取出高精度資料時,會自動轉成科學計數法!
例如資料庫裡存的是`0.0002`,取出來時,變成了2.0E-4.

對於這種高精度的資料,一般要用到BigDecimal類。


一般我們都是保留兩位小數,但是如上例中,`0.0002`我們希望保留的有效位,是從非0位2開始
的。我們該怎麼寫呢?
double a = 0.0002;  
BigDecimal b = new BigDecimal(String.valueOf(a));  
BigDecimal divisor = BigDecimal.ONE;  
MathContext mc = new MathContext(2
); System.out.println(b.divide(divisor, mc));
上面程式碼的意思:用一個`BigDecimal`物件除以`divisor`後的結果,並且要求這個結果保留
有mc個小數位。其中`BigDecimal.ONE`的值就是1。(0.0002/1保留2位有效小數)
儘量使用引數型別為String的建構函式。


這裡要說明下:
不要寫成這樣:
double a = 0.0002;  
BigDecimal b = new BigDecimal(String.valueOf(a));
BigDecimal setScale = bigDecimal.setScale(2
); System.out.println(setScale);
這樣會儲存會報錯,因為它的儲存方式不會去管,小數點後面的開始位是不是為0。假設它強行截
取得話(我們假設它不報錯),就變成了0.00。就更不對啦

網上參考資訊:

方法一:
scale指的是你小數點後的位數。比如123.456則score就是3.
score就是BigDecimal類中的方法啊。
你自己定義一個BigDecimal的物件呼叫一下就可以驗證。
比如:BigDecimal b = new BigDecimal("123.456");
b.scale(),返回的就是3.

方法二:
roundingMode是小數的保留模式。它們都是BigDecimal中的常量欄位,你可以看一下,有很
多種。
比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。

`pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)`
的意思是說:我用一個BigDecimal物件除以divisor後的結果,並且要求這個結果保留有
scale個小數位,roundingMode表示的就是保留模式是什麼,是四捨五入啊還是其它的,你可
以自己選!

如果我們後臺不轉換的話,放到前臺轉也可以的。前臺使用Number(),就可以把科學計數表示法
轉成正式顯示

參考地址