java處理高精度的商業計算
阿新 • • 發佈:2019-01-22
在公司寫程式碼時,發現從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(),就可以把科學計數表示法 轉成正式顯示
參考地址