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);
r15 0.139857142857143
这是您在 excel 中得到的数字。
我使用 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);
r15 0.139857142857143
这是您在 excel 中得到的数字。