BigDecimal类

2023/11/21 技术

解决小数运算中,出现不精确问题

注意如果运算出现除不尽的情况,就会出现异常

package bigdecimal;

public class BigDecimakDemo {
    public static void main(String[] args) {
        double num1 = 0.1;
        double num2 = 0.2;
        System.out.println(num1 + num2); // 0.30000000000000004
    }
}
1
2
3
4
5
6
7
8
9

# 1.三种创建对象的方法

# 1.1.public BigDecimal(double val)

不推荐无法保证小数运算的精确

package bigdecimal;

import java.math.BigDecimal;

public class BigDecimakDemo {
    public static void main(String[] args) {
        BigDecimal bd1 = new BigDecimal(0.1);
        BigDecimal bd2 = new BigDecimal(0.2);
        System.out.println(bd1.add(bd2)); //0.3000000000000000166533453693773481063544750213623046875
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 1.2.public BigDecimal(String val)

需要传入字符串类型的

package bigdecimal;

import java.math.BigDecimal;

public class BigDecimakDemo {
    public static void main(String[] args) {
        BigDecimal bd1 = new BigDecimal("0.1");
        BigDecimal bd2 = new BigDecimal("0.2");
        System.out.println(bd1.add(bd2));// 0.3
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 1.3.public static BigDecimal valueOf(double val)

调用静态方法

BigDecimal bigDecimal = BigDecimal.valueOf(0.1);
BigDecimal bigDecimal2 = BigDecimal.valueOf(0.2);
System.out.println(bigDecimal.add(bigDecimal2)); // 0.3
1
2
3

image-20231112174452270

BigDecimal bigDecimal = BigDecimal.valueOf(0.1);
BigDecimal bigDecimal2 = BigDecimal.valueOf(0.2);
System.out.println(bigDecimal.add(bigDecimal2)); // 0.3 加法
System.out.println(bigDecimal.subtract(bigDecimal2)); // -0.1 减法
System.out.println(bigDecimal.multiply(bigDecimal2)); // 0.02 乘法
System.out.println(bigDecimal.divide(bigDecimal2)); // 0.5 除法
1
2
3
4
5
6

image-20231112175901031

BigDecimal bigDecimal = BigDecimal.valueOf(10.0);
BigDecimal bigDecimal1 = BigDecimal.valueOf(3.0);
System.out.println(bigDecimal.divide(bigDecimal1, 2, RoundingMode.HALF_UP)); // 四舍五入 
// 3.33
        System.out.println(bigDecimal.divide(bigDecimal1, 2, RoundingMode.UP)); // 3.34  直接加1
        System.out.println(bigDecimal.divide(bigDecimal1, 2, RoundingMode.DOWN)); // 3.33 只取两位 其他全舍去
1
2
3
4
5
6

# 四舍五入求绝对值

要调用 doubleValue 方法

// 参数四舍五入 求绝对值
BigDecimal bigDecimal = BigDecimal.valueOf(-10.0);
BigDecimal bigDecimal1 = BigDecimal.valueOf(-3.0);
BigDecimal divide = bigDecimal.divide(bigDecimal1, 2, RoundingMode.HALF_UP);
double v = divide.doubleValue(); // 转 double
System.out.println(Math.abs(v)); // 3.33
1
2
3
4
5
6
LOSER
米津玄師