相同的Java版本对double值产生不同的输出



我有一个很长的双精度和,它产生一个输出。当我执行E2E测试时,问题出现了,我的本地环境得到了一定数量的小数的结果,但在开发机器中,尽管它具有相同的体系结构和相同的java版本,小数不匹配某些总和。

例如:

match failed: EQUALS
$ | not equal (NUMBER:NUMBER)
6764785.117418662 ---> dev
6764785.11741866  ---> Local
match failed: EQUALS
$ | not equal (NUMBER:NUMBER)
9.7787576643837 ---> dev
9.778757664383699 ---> Local
match failed: EQUALS
$ | not equal (NUMBER:NUMBER)
2.0465350497710526 ---> dev
2.046535049771075 ---> Local

这些只是一些例子。

我正在使用openjdk版本"11.0.15";2012-04-19 from temurin

我也尝试了另一个java版本,但它一直发生相同的。你知道我做错了什么吗?也使用intelliJ最新版本

我们的计算机不能存储double类型的精确表示。它们必须四舍五入才能保存。这就是为什么直接将它们与==进行比较可能会产生意想不到的结果。你可以在这里阅读更多关于这个话题。

java中正确比较双精度类型的例子:

double epsilon = 0.000001d;
assertThat(Math.abs(d1 - d2) < epsilon).isTrue();

最新更新