float 和 double 的缺点
一般的 float 和 double 类型数据只能用来做科学计算或工程计算
计算过程:由于 计算机底层是 二进制,所以 十进制 转 二进制,然后才能计算,最后还需要将 二进制 转成 十进制
缺点: 在进制转换时,会产生误差,原因详见 链接
例子
double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println(c);
执行结果如下:
0.30000000000000004
原因详见 链接
BigDecimal
由于在商业计算中要求数字精度比较高,所以要用到 BigDecimal 类。
BigDecimal 类支持 任何精度的浮点数,可以用来精确计算货币值。
创建对象
构造方法:
BigDecimal(double val):实例化时将双精度型转换为 BigDecimal 类型。不推荐,计算时还是会产生误差BigDecimal(String val):实例化时将字符串形式转换为 BigDecimal 类型。推荐
其他方法:
BigDecimal.valueOf(double val):底层代码是先将double类型的形参转成String类型,然后调用BigDecimal(String val)。推荐
例子
BigDecimal b1 = new BigDecimal(0.01);
BigDecimal b2 = new BigDecimal("0.01");
BigDecimal b3 = BigDecimal.valueOf(0.01);
System.out.println("b1=" + b1) // 会有无限小数,不推荐
System.out.println("b2=" + b2) // 推荐
System.out.println("b3=" + b3) // 推荐
常用方法 - 判断相等
equals():会比较精度,所以0.01与0.010不相等。不推荐compareTo():只是比较数值,即:0.01与0.010相等。推荐
例子
BigDecimal b1 = BigDecimal.valueOf(0.01);
BigDecimal b2 = BigDecimal.valueOf(0.010);
System.out.println(b1.equals(b2)) // false
System.out.println(b1.compareTo(b2)) // 0,表示相等
常用方法 - 加减乘除
BigDecimal 类的方法可以用来做超大浮点数的运算,像 加、减、乘和除 等:
add(BigDecimal augend):加法操作subtract(BigDecimal subtrahend):减法操作multiply(BigDecimal multiplieand):乘法操作
除法:
divide(BigDecimal divisor):如果结果是 无限小数会 报错。不推荐
divide(BigDecimal divisor,int scale,int roundingMode )除法操作。推荐divisor:除数scale:精度,即:商的小数点后的位数roundingMode:近似值处理模式
例子
加法运算
BigDecimal a2 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.2");
// 计算时不能直接使用 +-*/等符号,必须使用方法
BigDecimal c2 = a2.add(b2);
System.out.println(c2.doubleValue());
执行结果:
0.3
除法
BigDecimal b1 = new BigDecimal("1.0");
BigDecimal b2 = new BigDecimal("3.0");
// 四舍五入保留小数点后两位
BigDecimal res = b1.divide(b2,2,RoundingMode.HALF_UP);
System.out.println(res.doubleValue());
参考:
https://www.bilibili.com/video/BV1gw411J7CU/