// 加法 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
....it