Java BigDecimal 精度问题

2022-09-03 08:42:01

我知道以下行为是一个老问题,但我仍然不明白。

System.out.println(0.1 + 0.1 + 0.1);    

或者即使我使用BigDecimal

System.out.println(new BigDecimal(0.1).doubleValue()
    + new BigDecimal(0.1).doubleValue()
    + new BigDecimal(0.1).doubleValue());

为什么这个结果是:而不是:?0.300000000000000040.3

我该如何解决这个问题?


答案 1

你真正想要的是

new BigDecimal("0.1")
 .add(new BigDecimal("0.1"))
 .add(new BigDecimal("0.1"));

构造函数得到了 的所有不精确性,所以当你说的时候,你已经引入了舍入误差。使用构造函数可避免与通过 .new BigDecimal(double)double0.1Stringdouble


答案 2

首先,永远不要使用BigDecimal的双重构造函数。在少数情况下,这可能是正确的事情,但大多数情况下它不是

如果可以控制输入,请使用已建议的 BigDecimal 字符串构造函数。这样你就能得到你想要的。如果你已经有一个双精度矩阵(毕竟可能发生),不要使用双精度构造函数,而是使用静态方法。这有一个很好的优势,即我们得到了双精度的炮法表示,这至少缓解了这个问题。结果通常更直观。valueOf


推荐