Java 双精度丢失

Java double losing precision

我使用 Java 中的双精度进行了一系列计算,总和应为 1.0。偶尔,在 Java 中,总和会稍微偏离。我在 Excel 中进行了计算,它们加起来确实是 1.0。我怀疑这与一些双舍入错误有关。让我感到困惑的是它在 Excel 中有效。知道我能做些什么来解决这个问题吗?

我在Java中有以下代码:

  double d1 = 0.979;
  double d2 = 3;
  double d3 = 21;
  double d4 = d1 * d2 / d3;
  System.out.println("d4 " + d4);

打印 0.13985714285714285。在 Excel 中,如果我进行相同的计算 (=C14*D14/E14),其中 C14 是 d1,D14 是 d2,E14 是 d3,我得到 0.1398571428571430000。 Excel 是否正确,因为它是四舍五入的?

谢谢。

尝试用 BigDecimals 来做。尽管 Java double 不是处理小数的精确方法,但它仍然非常准确,而且肯定比 Excel.

更准确

使用 BigDecimal,您可以自己控制舍入,还可以处理小数而不是二进制小数,如果您习惯于使用小数,则结果会更直观。

public static void main(String[] args) {
    BigDecimal d1 = new BigDecimal("0.979");
    BigDecimal d2 = new BigDecimal("3");
    BigDecimal d3 = new BigDecimal("21");
    BigDecimal d4 = d1.multiply(d2.divide(d3, MathContext.DECIMAL128));
    System.out.println("d4 " + d4);
}

输出:

d4 0.1398571428571428571428571428571428991

如果你想将结果四舍五入到小数点后 15 位,你可以这样做

double d1 = 0.979;
double d2 = 3;
double d3 = 21;
double d4 = d1 * d2 / d3;
double r15 = Math.round(d4 * 1e15) / 1e15;
System.out.println("r15 " + r15);

https://ideone.com/s0mT72 打印

r15 0.139857142857143

这是您在 excel 中得到的数字。