一. 说明
用于解决浮点型运算时,出现结果失真的问题。
由于计算机本身的二进制并不能很精确的计算度,直接进行+ - * /也可能出现运算结果失真
可以看到在上述代码中,0.1+0.2并不完全等于0.3,这在某些情况下会出现问题,所以这个时候我们就要用到BigDecimal了
二. 常用的方法
构造器 | 说明 |
---|---|
public BigDecimal(double val) 注意:不推荐使用这个 | 将double转换为BigDecimal |
public BigDecimal(String val) | 把String转成BigDecimal |
方法名 | 说明 |
---|---|
public static BigDecimal valueOf(double val) | 转换一个double成BigDecimal |
public BigDecimal add(BigDecimal b) | 加法 |
public BigDecimal subtract(BigDecimal b) | 减法 |
public BigDecimal multiply(BigDecimal b) | 乘法 |
public BigDecimal divide(BigDecimal b) | 除法 |
public BigDecimal divide(另一个BigDecimal对象,精确几位,舍入模式) | 除法,可以控制精确到小数几位 |
public double doubleValue() | 将BigDecimal转换为double |
三. 使用
1. 首先将float类型的a和b转化为BigDecimal
public class bigDecimalDemo1 {
public static void main(String[] args) {
double a = 0.1;
double b = 0.2;
BigDecimal a1 = new BigDecimal(Double.toString(a));
BigDecimal b1 = new BigDecimal(Double.toString(b));
BigDecimal a2 = BigDecimal.valueOf(a);
BigDecimal b2 = BigDecimal.valueOf(b);
}
}
让我们来看看上面的代码,我们使用了两种方式:
第一种是将double类型的先转化为String,再去通过BigDecimal的构造方法来将它转化为BigDecimal。
实际上,我们直接采用第二种方法即可,通过valueOf方法,他会自动将a和b转化为BigDecimal,不需要我们手动去写。
2. 加法,减法,乘法,除法
BigDecimal c1 = a1.add(b1); //除法
BigDecimal c2 = a1.subtract(b1); //减法
BigDecimal c3 = a1.multiply(b1); //乘法
BigDecimal c4 = a1.divide(b1); //除法
要非常注意,这里的除法有一点问题!
public class bigDecimalDemo1 {
public static void main(String[] args) {
BigDecimal i = BigDecimal.valueOf(0.1);
BigDecimal j = BigDecimal.valueOf(0.3);
BigDecimal k = i.divide(j);
System.out.println(k);
}
}
运行上面的代码,我们就会发现报错了。因为1/3本身就是非精确运算,但是BigDecimal必须要有一个精确的结果,所以这里就报错了。这个时候,我们就需要修改一下了,采用public BigDecimal divide(另一个BigDecimal对象,精确几位,舍入模式)来对它进行四舍五入。
BigDecimal k = i.divide(j,2, RoundingMode.HALF_UP);
2指的是精确的范围,后面的则是模式。
运算完成之后,我们可以通过下面的方法将BigDecimal转换成double类型的数据:
double rs = k.doubleValue();