JAVA17 vs JAVA8 双重表示

问题描述 投票:0回答:1

在 2 个不同的 JVM(JDK8 和 JDK17)之间进行平均时,相同值存在差异的原因是什么?

是因为浮点数吗?或者两个版本之间发生了其他变化??

JAVA17

public class Main {
    public static void main(String[] args) {

        List<Double> amountList = List.of(27.19, 18.97, 6.44, 106.36);

        System.out.println("JAVA 17 result: " + amountList.stream().mapToDouble(x -> x).average().orElseThrow());

    }
}

结果:39.739999999999995

JAVA8

public class Main {

    public static void main(String[] args) {

        List<Double> amountList = Arrays.asList(27.19, 18.97, 6.44, 106.36);

        System.out.println("JAVA 8 result: " + amountList.stream().mapToDouble(x -> x).average().orElse(0.0));
    }
}

结果:39.74000000000001

java floating-point jvm precision
1个回答
0
投票

我认为这是因为 JEP 306:恢复始终严格的浮点语义

double
的表示没有改变,但浮点运算的行为发生了改变。

在 Java 17 之前,如果不使用关键字

strictfp
,浮点运算在某些情况下可能会给出与标准略有偏差的结果。自 Java 17 起,所有浮点运算符都严格遵守 IEEE754。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.