BigDecimal类

1. 问题

浮点数做运算时精度出现问题。

double和float采用近似值存储。

如:

double a = 1.0;
double b = 0.9;
// a-b = 0.09999...8

double result = (1.4 - 0.5) / 0.9;
// result = 0.9999...

2. 使用场景

精度要求非常高,需要进行精确运算。

  • 位置:java.math包中。
  • 作用:精确计算浮点数。
  • 创建方式:BigDecimal bd = new BigDecimal("1.0");传参一定要用字符串,字符串是最准确的。

3. 常用方法

  • BigDecimal add(BigDecimal bd)加。

  • BigDecimal subtract(BigDecimal bd)减。

  • BigDecimal multiply(BigDecimal bd)乘。

  • BigDecimal divide(BigDevimal divisor, int scale, int roudingMode)除。

    scale:精确到小数点后几位。

    roudingMode:指定小数部分的取舍模式。

    ​ 四舍五入模式的取值为BigDecimal.ROUND_HALF_UP.

4. 使用方法

BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");

BigDecimal r1 = bd1.subtract(bd2);    // 相减运算,结果为0.1
BigDecimal r2 = bd1.add(bd2);    //加法运算,1.9
BigDecimal r3 = bd1.multiply(bd2);    //乘法运算,0.90

BigDecimal r4 = new BigDecimal("1.4").subtract(new BigDecimal("0.5")).divide(new BigDecimal("0.9"));    // 先相减再相除,结果为1

BigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3"));    // 报异常,除不尽,没有指定需要保留多少位小数

// 可以用divide的重载方法divide(BigDevimal divisor, int scale, int roudingMode);
// divisor 除数;scale 保留多少位小数;roudingMode 保留小数的方法,在BigDBigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3"));    ecimal类的常量中定义。
BigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3", 2, BigDecimal.ROUND_HALF_UP));    // 被除数10,除数3,保留2位小数,采用四舍五入法取舍。结果为3.33

去除后无用0+使用避免输出科学计数法的字符串
    .stripTrailingZeros().toPlainString()
Copyright © rootwhois.cn 2021-2022 all right reserved,powered by GitbookFile Modify: 2022-05-18 16:24:00

results matching ""

    No results matching ""