概述
BigDecimal是Java中一个用于高精度计算的类。它提供了完整的精确数字运算功能,可以处理需要高精度或大范围数字运算的场景。
与基本数据类型(如int、double)相比,BigDecimal能够提供任意精度的小数点运算,避免了浮点数运算中的精度损失问题。
BigDecimal可以进行加、减、乘、除等基本数学运算,同时也支持取余、取整、比较大小等操作。它还提供了一系列方法来处理特殊需求,比如设置精度、四舍五入等。
使用BigDecimal时,需要通过其构造函数来创建BigDecimal对象,可以传入String、double或BigInteger等数据类型作为参数。BigDecimal对象创建后,可以进行各种精确的数学运算。
应用场景
用于解决浮点型运算时,出现结果失真的问题。
浮点型运算时出现的失真错误案例如下:
这个时候0.1 + 0.2 != 0.3 ,显然是错误的。
BigDecimal的使用方法
把double类型变成字符串,封装成BigDecimal对象来运算。
此时我们调用Double类中的Double.toString()方法将双精度浮点a和b转换为字符串表示形式。
当然,我们有一种优化写法
BigDecimal中的valueOf方法可以直接把double类型的数据接收过来转成字符串封装给BigDecimal对象。
valueOf原码:
再然后,调用BigDecimal中的add方法将两个数加起来,封装给一个新的BigDecimal对象
需要注意一点,此时我们输出c1,并没有输出c1的地址,说明BigDecimal也重写了object类中的toString方法,把c1对象里面运算出的结果直接输出了。
同样可以进行减法、乘法和除法运算:
进行除法运算时,我们要考虑一种情况,比如一除以三......
此时,程序报错~
原因就是最终结果是0.33333333333........而BigDecimal必须得到一个精准的结果,所以他就崩溃了
解决方法:我们可以调用另一个divide方法
public BigDecimal divide(另一个BigDecimal对象 , 精确几位 , 舍入模式)
这样输出的结果就是 0.33 了
最后,我们经常使用double来修饰双精度浮点数,所以我们还得把运算结果变成double类型
把BigDecimal对象转换成double类型的数据
注意事项
本文章介绍了正例中的两个办法,没有介绍BigDecimal(double)方法的原因如上
本文中使用的代码
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Test {
public static void main(String[] args) {
double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println(c);
System.out.println("-----------------------");
BigDecimal a1 = BigDecimal.valueOf(a);
BigDecimal b1 = BigDecimal.valueOf(b);
BigDecimal c1 = a1.add(b1);
System.out.println(c1);
BigDecimal c2 = a1.subtract(b1); //减法
BigDecimal c3 = a1.multiply(b1); // 乘法
BigDecimal c4 = a1.divide(b1); // 除法
System.out.println("减法:" + c2 + " 乘法:" + c3 + " 除法:" + c4);
System.out.println("--------------------------");
BigDecimal x = BigDecimal.valueOf(0.1);
BigDecimal y = BigDecimal.valueOf(0.3);
BigDecimal k = x.divide(y,2, RoundingMode.HALF_UP); // 除法
Double db = k.doubleValue();
System.out.println(db);
}
}
最后祝大家好好学习,天天向上
(能给我点个赞就更好了)