BigDecimal通常可以用来金额保存计算,经常遇到保留小数位的问题。
通过调用setScale(int newScale, int roundingMode)
传入保留小数位,舍入模式两个参数获取新的BigDecimal。
源码是总共有8种,按源码传入的参数对应int值分为0-7,简单记忆0-5可以分成两两对应,6是向两端最近靠近,7是不符合精确就抛出异常。以下介绍8种roundingMode的用法:
0.BigDecimal.ROUND_UP
保留X位,X位始终进位,无论X位后是多大。如:3.1411保留3位,则为3.142。
System.out.println("-----BigDecimal.ROUND_UP-----");
//保留3位,第3位始终进位 3.1411-》3.142
BigDecimal roundUp = new BigDecimal("3.1411");
roundUp = roundUp.setScale(3, BigDecimal.ROUND_UP);
System.out.println("3.1411===>"+roundUp);
1.BigDecimal.ROUND_DOWN
保留X位,直接丢弃X位后面的。如:3.1415保留3位,则为3.141
System.out.println("-----BigDecimal.ROUND_DOWN-----");
//保留3位,直接丢弃后面的 3.1415-》3.141
BigDecimal roundDown = new BigDecimal("3.1415");
roundDown = roundDown.setScale(3, BigDecimal.ROUND_DOWN);
System.out.println("3.1415===>"+roundDown);
2.BigDecimal.ROUND_CEILING
保留X位,向变大靠近。正数,则X位进位。负数,则X位不变,丢弃X后的位数。如:3.1415保留3位,则为3.142。-3.1415保留3位,则为-3.141。
//接近正无穷大的舍入(变大)
System.out.println("-----BigDecimal.ROUND_CEILING-----");
//保留3位,往正靠近 3.1415->3.142
BigDecimal roundCEILING = new BigDecimal("3.1415");
roundCEILING = roundCEILING.setScale(3, BigDecimal.ROUND_CEILING);
System.out.println("3.1415===>"+roundCEILING);
roundCEILING = new BigDecimal("-3.1415");
roundCEILING = roundCEILING.setScale(3, BigDecimal.ROUND_CEILING);
System.out.println("-3.1415===>"+roundCEILING);
3.BigDecimal.ROUND_FLOOR
保留X位,向变小靠近。负数,则X位进位。正数,则X位不变,丢弃X后的位数。如:3.1415保留3位,则为3.141。-3.1415保留3位,则为-3.142。
//接近负无穷大的舍入(变小)
System.out.println("-----BigDecimal.ROUND_FLOOR-----");
//保留3位,往负靠近 3.1415->3.141
BigDecimal roundFLOOR = new BigDecimal("-3.1415");
roundFLOOR = roundFLOOR.setScale(3, BigDecimal.ROUND_FLOOR);
System.out.println("-3.1415===>"+roundFLOOR);
roundFLOOR = new BigDecimal("3.1415");
roundFLOOR = roundFLOOR.setScale(3, BigDecimal.ROUND_FLOOR);
System.out.println("3.1415===>"+roundFLOOR);
4.BigDecimal.ROUND_HALF_UP
保留X位,根据后一位四舍五入。如:3.1414保留3位,结果为3.141.。3.1415保留3位,结果为3.142。
System.out.println("-----BigDecimal.ROUND_HALF_UP-----");
//保留3位,根据后一位四舍五入
BigDecimal roundHALFUP = new BigDecimal("3.1415");
roundHALFUP = roundHALFUP.setScale(3, BigDecimal.ROUND_HALF_UP);
System.out.println("3.1415===>"+roundHALFUP);
5.BigDecimal.ROUND_HALF_DOWN
保留X位,根据后一位五舍六入。如3.1415保留3位,结果为3.1416。3.1416保留3位,结果为3.142。
System.out.println("-----BigDecimal.ROUND_HALF_DOWN-----");
//保留3位,根据后一位五舍六入
BigDecimal roundHALFDOWN = new BigDecimal("3.1415");
roundHALFDOWN = roundHALFDOWN.setScale(3, BigDecimal.ROUND_HALF_DOWN);
System.out.println("3.1415===>"+roundHALFDOWN);
roundHALFDOWN = new BigDecimal("3.1416");
roundHALFDOWN = roundHALFDOWN.setScale(3, BigDecimal.ROUND_HALF_DOWN);
System.out.println("3.1416===>"+roundHALFDOWN);
6.BigDecimal.ROUND_HALF_EVEN
保留X位,向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如3.1413保留3位,3.141和3.142距离最近的是3.141,结果3.141。
//向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入
System.out.println("-----BigDecimal.ROUND_HALF_EVEN-----");
BigDecimal roundHALFEVEN = new BigDecimal("3.1413");
roundHALFEVEN = roundHALFEVEN.setScale(3, BigDecimal.ROUND_HALF_EVEN);
System.out.println("3.1413===>"+roundHALFEVEN);
roundHALFEVEN = new BigDecimal("3.1415");
roundHALFEVEN = roundHALFEVEN.setScale(3, BigDecimal.ROUND_HALF_EVEN);
System.out.println("3.1415===>"+roundHALFEVEN);
7.BigDecimal.ROUND_UNNECESSARY
计算结果必须是精确的,不需要舍入的,否则抛出 ArithmeticException。如3.141保留3位符合,结果为3.141。3.14保留3位,不够补零,结果为3.140。3.1415超出位数,则抛出异常ArithmeticException。
System.out.println("-----BigDecimal.ROUND_UNNECESSARY-----");
BigDecimal unnecessary = new BigDecimal("3.141");
unnecessary = unnecessary.setScale(3, BigDecimal.ROUND_UNNECESSARY);
System.out.println("3.141===>"+unnecessary);
unnecessary = new BigDecimal("3.1415");
unnecessary = unnecessary.setScale(3, BigDecimal.ROUND_UNNECESSARY);
System.out.println(unnecessary);
不指定rounding
传入一个参数保留X小数,不传入舍入模式,默认用的ROUND_UNNECESSARY。
System.out.println("-----不指定rounding-----");
BigDecimal bigDecimal = new BigDecimal("3.1415");
bigDecimal = bigDecimal.setScale(3);
System.out.println(bigDecimal);
总结
8种保留小数位的方法如果不熟悉,可以按照 以下对应关系来熟悉使用。
ROUND_UP 进位 《====》ROUND_DOWN 丢弃
ROUND_CEILING 变大《====》ROUND_FLOOR 变小
ROUND_HALF_UP 四舍五入《====》ROUND_HALF_DOWN 五舍六入
ROUND_HALF_EVEN 向最近的靠近
ROUND_UNNECESSARY 不精确抛出异常