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. 指定舍入模式后解决
相关文章
相关标签/搜索