![cover](https://images-1319591454.cos.ap-nanjing.myqcloud.com/images/2023-8-31%2022%3A32%3A141693492334790.png)
BigDecimal
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)。
- 感谢你赐予我前进的力量