JAVA BigDecimal 类

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/


原文出处:/show_1EF4rzualoAo.html