繁体   English   中英

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中获得的数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM