Java双失精度

时间:2016-03-14 01:22:50

标签: java excel double

我在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是否正确,因为它是四舍五入的?

感谢。

2 个答案:

答案 0 :(得分:0)

尝试使用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

答案 1 :(得分:0)

如果要将结果舍入到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中获得的数字。