java.math.BigDecimal--用来对16位的有效位进行精确的计算。
实际开发中,会对金额进行合计、拆分,必然要对金额进行加减乘除。而BigDecimal用来对金额的计算有很大好处。
BigDecimal对数字的计算有两个关键参数:
1)scale--确定计算后保留的小数位数;是int类型
2)roundingMode--确定计算后小数的精确度
BigDecimal.ROUND_UP--不舍弃小数点后的,进位处理;全部加1
BigDecimal.ROUND_DOWN-->直接舍弃小数点后的
BigDecimal.ROUND_CEILING--->往正无穷进位,Ceiling后的值 是离 原值最近的,比原值大的。
BigDecimal.ROUND_FLOOR-->>往负无穷走,Celing后的值 是离 原值最近的,比原值小的。
BigDecimal.ROUND_HALF_DOWN-->>四舍五入
BigDecimal.ROUND_HALF_UP--->>五舍六入
BigDecimal.ROUND_HALF_EVEN-->>
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
如果前一位为奇数,则入位,否则舍去。
代码案例
1)BigDecimal.ROUND_UP
BigDecimal big4=bigdecimal.setScale(3,BigDecimal.ROUND_UP);/*不舍弃小数点后的,进位处理;全部加1*/ System.out.println("=======金额bigDecimal="+bigDecimal+";ROUND_UP==big4="+big4+"=========="); /* * =======金额bigDecimal=3.333333;big6=3.334========== * =======金额bigDecimal=3.4444;ROUND_UP==big4=3.445========== * =======金额bigDecimal=3.5555;ROUND_UP==big4=3.556=========
2)BigDecimal.ROUND_DOWN
BigDecimal big5=bigDecimal.setScale(3,BigDecimal.ROUND_DOWN);/*直接舍弃小数点后的*/ System.out.println("=======金额bigDecimal="+bigDecimal+";ROUND_DOWN==big5="+big5+"=========="); /* * =======金额bigDecimal=3.333333;big5=3.333========== * =======金额bigDecimal=3.4444;ROUND_DOWN==big5=3.444========== *=======金额bigDecimal=3.5555;ROUND_DOWN==big5=3.555========== * */
3)BigDecimal.ROUND_CEILING
BigDecimal big6=bigDecimal.setScale(3,BigDecimal.ROUND_CEILING);/*如果BigDecimal是正的,则做ROUND_UP操作;如果为负,则做ROUND_DOWN操作。 */ System.out.println("=======金额bigDecimal="+bigDecimal+";ROUND_CEILING==big6="+big6+"=========="); /* * =======金额bigDecimal=3.333333;big6=3.334========== * =======金额bigDecimal=3.4444;ROUND_CEILING==big6=3.445========== * =======金额bigDecimal=3.5555;ROUND_CEILING==big6=3.556========== * * =======金额bigDecimal=-3.444;ROUND_CEILING==big6=-3.444========== =======金额bigDecimal=-3.555;ROUND_CEILING==big7=-3.555========== * */
4)BigDecimal.ROUND_FLOOR
BigDecimal big7=bigDecimal.setScale(3,BigDecimal.ROUND_FLOOR); System.out.println("=======金额bigDecimal="+bigDecimal+";ROUND_FLOOR==big7="+big7+"=========="); /* * =======金额bigDecimal=3.333333;big7=3.333========== *=======金额bigDecimal=3.4444;ROUND_FLOOR==big7=3.444========== * =======金额bigDecimal=3.5555;ROUND_FLOOR==big7=3.555========== * * * =======金额bigDecimal=-3.444;ROUND_CEILING==big6=-3.444========== =======金额bigDecimal=-3.555;ROUND_CEILING==big7=-3.555========== * */
5)BigDecimal.ROUND_HALF_DOWN
BigDecimal big8=bigDecimal.setScale(3,BigDecimal.ROUND_HALF_DOWN); System.out.println("=======金额bigDecimal="+bigDecimal+";ROUND_HALF_DOWN==big8="+big8+"=========="); /* * =======金额bigDecimal=3.333333;big8=3.333========== * =======金额bigDecimal=3.4444;ROUND_HALF_DOWN==big8=3.444========== * =======金额bigDecimal=3.5555;ROUND_HALF_DOWN==big8=3.555========== * */
6)BigDecimal.ROUND_HALF_UP
BigDecimal big9=bigDecimal.setScale(3,BigDecimal.ROUND_HALF_UP);/*四舍五入*/
System.out.println("=======金额bigDecimal="+bigDecimal+";ROUND_HALF_UP==big9="+big9+"==========");
/*
* =======金额bigDecimal=3.333333;big9=3.333==========
* =======金额bigDecimal=3.4444;ROUND_HALF_UP==big9=3.444==========
* =======金额bigDecimal=3.5555;ROUND_HALF_UP==big9=3.556==========
* =======金额bigDecimal=3.5555;ROUND_HALF_EVEN==big10=3.556==========
* */
7)BigDecimal.ROUND_HALF_EVEN
BigDecimal big10=new BigDecimal("3.555").setScale(2,BigDecimal.ROUND_HALF_EVEN);
BigDecimal big11=new BigDecimal("3.666").setScale(2,BigDecimal.ROUND_HALF_EVEN);
System.out.println("=======金额bigDecimal="+big10+";ROUND_HALF_EVEN==big11="+big11+"==========");
/*
* =======金额bigDecimal=1.555;ROUND_FLOOR==big7=1.55==========
=======金额bigDecimal=3.56;ROUND_HALF_EVEN==big11=3.67==========
* */
----------------
实际应用
除/乘
BigDecimal value=bigDeciamalB.divide(bigDecimalC,int Scale,int roundingMode);
@Test public void testMoney(){ splitMoney(new Money(100),new Money(25)); splitMoney(new Money(100),new Money(33)); /*splitMoney(new Money(100),new Money(25));*/ } public void splitMoney(Money amount,Money quota){ System.out.println("======金额amount="+amount+";限额quota="+quota+"==========="); BigDecimal amountB=amount.getAmount(); BigDecimal quotaB=quota.getAmount(); String dg= amountB.divide(quotaB,2,BigDecimal.ROUND_UP).toString(); System.out.println("金额divide后="+dg); String times=dg.split("\\.")[0]; System.out.println("金额拆分split后="+times); Money multi=quota.multiply(Integer.valueOf(times)); System.out.println("金额multi后="+multi); Money moneyLast=amount.subtract(multi); System.out.println("金额subtract后="+moneyLast); System.out.println("======拆分结束========="); }