在 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
我认为这是因为 JEP 306:恢复始终严格的浮点语义。
double
的表示没有改变,但浮点运算的行为发生了改变。
在 Java 17 之前,如果不使用关键字
strictfp
,浮点运算在某些情况下可能会给出与标准略有偏差的结果。自 Java 17 起,所有浮点运算符都严格遵守 IEEE754。