问题描述

在使用new BigDecimal 时,发现如果是浮点数new出来的值就会与预期的不符

  • 示例代码

    1. System.out.println(new BigDecimal(0.99));
    2. System.out.println(new BigDecimal("0.99"));
    3. System.out.println(BigDecimal.valueOf(0.99));
    4. System.out.println(new BigDecimal(Double.valueOf(0.99)));
    5. System.out.println(new BigDecimal(Double.valueOf(0.99).toString()));
  • 输出结果

    1. 0.9899999999999999911182158029987476766109466552734375
    2. 0.99
    3. 0.99
    4. 0.9899999999999999911182158029987476766109466552734375
    5. 0.99

    问题原因

    查看 BigDecimal(double val) 构造函数,看到描述中不建议直接使用,构造函数的结果不可预测。
    image.png

    1. public BigDecimal(double val) {
    2. this(val,MathContext.UNLIMITED);
    3. }

    解决方案:

    根据上面的描述可以使用以下两种方案解决此问题

    方案1:BigDecimal. valueOf(浮点数)

  1. BigDecimal. valueOf(double);

方案2:new BigDecimal(字符串)

  1. String value = Double.toString(double);
  2. new BigDecimal(value);