BigDecimal 高精度處理金額等敏感數據

加減乘除的簡單用法

// 加法
BigDecimal bigDecimal1 = new BigDecimal(100.22).add(new BigDecimal(0.01));
// 減法
BigDecimal bigDecimal2 = new BigDecimal(100.22).subtract(new BigDecimal(0.22));
// 乘法
BigDecimal bigDecimal3 = new BigDecimal(100.22).multiply(new BigDecimal(0.01));
// 除法
BigDecimal bigDecimal4 = new BigDecimal(100.22).divide(new BigDecimal(1));
bigDecimal1=100.22999999999999886333978960095691945753060281276702880859375 bigDecimal2=99.9999999999999988620213997592145460657775402069091796875 bigDecimal3=1.00220000000000000949379463932586962963930873545808557374705541516413109803806946729309856891632080078125
bigDecimal4=100.219999999999998863131622783839702606201171875

根據以上運算的輸出結果來看,用以肯定精度的小數構造、或計算產生的BigDecimal類型都會自動補上小數位,通常在正常業務操做時,都會對Bigdecimal類型的結果進行手動小數位保留java

保留小數位用法

BigDecimal.setScale( )方法ide

new BigDecimal(100.245).setScale(2, RoundingMode.HALF_UP); // 100.25
new BigDecimal(100.245).setScale(2, BigDecimal.ROUND_HALF_UP) // 100.25

上面了兩種用法同樣,都是 保留兩位小數,舍入模式爲 四捨五入,spa

其餘經常使用舍入模式有:code

setScale(1,BigDecimal.ROUND_DOWN) //直接刪除多餘的小數位,如2.35會變成2.3 
setScale(1,BigDecimal.ROUND_UP) //進位處理,2.35變成2.4  
setScaler(1,BigDecimal.ROUND_HALF_DOWN) //四捨五入,2.35變成2.3,若是是5則向下舍

new BigDecimal(100).setScale(2) 會進行補指定的小數位ip

new BigDecimal(100.25).setScale(1) 就會報出異常 java.lang.ArithmeticException: Rounding necessary , 緣由是 對100.259999999....取兩位小數,精度丟失 又沒指定舍入的模式,指定舍入模式就可解決ci

BigDecimal之間的比較

....it

小結

  • 在除法divide(), 也可傳要保留的小數位 scale,舍入的模式roundingModel
  • 使用除法divide()時,未進行整除,結果產生了無限循環小數會報錯:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 指定舍入模式後解決
相關文章
相關標籤/搜索