BigDecimal与Money的联系

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("======拆分结束=========");
}


 
  

   

你可能感兴趣的:(java)