BigDecimal

​ 在我们写代码过程中有时会遇到较大数字之间的计算问题,比如金额的计算,这个时候使用浮点类型进行计算可能就不那么准确了,会损失一定的精准度.

如果要用BigDecimal 进行数学运算,不能使用+ , - ,* , /等传统运算符,而要调用其对应的方法。

一、BigDecimal 初始化

1、在 new BigDecimal() 时,不推荐使用这种方法 ,可能会出现数值不精准。

new BigDecimal(5)

2、推荐使用:

new BigDecimal("5");
new BigDecimal("0.5");

3、其他方法:这种方法虽然不需要我们去new,但是在底层也是new的

BigDecimal.TEN; // 10
BigDecimal.ONE; // 1
BigDecimal.ZERO; // 0

​ 如下图所示:

二、BigDecimal 运算

// 加法
add(BigDecimal augend)   BigDecimal
    
// 减法
subtract(BigDecimal subtrahend)   BigDecimal
    
// 乘法
multiply(BigDecimal multiplicand)   BigDecimal

// 除法
divide(BigDecimal divisor, int scale, RoundingMode roundingMode)  BigDecimal

// 绝对值
abs()  BigDecimal

1、比较大小

已知两个BigDecimal类型a,b(前提条件a,b不为null) 进行比较:

if(a.compareTo(b) == -1){
    System.out.println("a小于b");
}
 
if(a.compareTo(b) == 0){
    System.out.println("a等于b");
}
 
if(a.compareTo(b) == 1){
    System.out.println("a大于b");
}
 
if(a.compareTo(b) > -1){
    System.out.println("a大于等于b");
}
 
if(a.compareTo(b) < 1){
    System.out.println("a小于等于b");
}

2、除法参数介绍

divide(BigDecimal divisor 除数, int scale 精确小数位, int roundingMode 舍入模式)

3、舍入模式介绍

  • ROUND_UP:无论后面是多少**(后面是0的话除外),在绝对值的角度,始终对非零舍弃部分前面的数字+1**。

  • ROUND_DOWN:无论后面是多少,都直接丢弃,不会对舍弃部分前面的数字+1。

  • ROUND_CEILING:无论后面是多少**(后面是0的话除外),值为正**,舍入模式与ROUND_UP相同,值为,舍入模式与ROUND_DOWN相同。

  • ROUND_FLOOR:无论后面是多少**(后面是0的话除外),值为正**,舍入模式与ROUND_DOWN相同,值为,舍入模式与ROUND_UP相同。

  • ROUND_HALF_UP:在绝对值的角度舍和入,这就是我们熟识的==四舍五入模式==,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。

    如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同,否则舍入行为与 ROUND_DOWN 相同。

  • ROUND_HALF_DOWN:在绝对值的角度舍和入。如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同。否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

  • ROUND_HALF_EVEN:如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同。

    如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。

    此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。如果前一位为奇数,则入位,否则舍去。

  • ROUND_UNNECESSARY: 断言请求的操作具有精确的结果,因此不需要舍入(如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException)。