Tag: double precision

使用双精度时,为什么不(x /(y * z))与(x / y / z)相同?

这部分是学术性的,就我的目的而言,我只需将它四舍五入到小数点后两位; 但我很想知道结果会产生两个略有不同的结果。 这是我写的测试,以缩小到最简单的实现: @Test public void shouldEqual() { double expected = 450.00d / (7d * 60); // 1.0714285714285714 double actual = 450.00d / 7d / 60; // 1.0714285714285716 assertThat(actual).isEqualTo(expected); } 但它输出失败了: org.junit.ComparisonFailure: Expected :1.0714285714285714 Actual :1.0714285714285716 任何人都可以详细解释在引擎盖下发生的事情导致1.000000000000000 X的值不同吗? 我在答案中寻找的一些要点是:精度丢失在哪里? 首选哪种方法,为什么? 哪个是正确的? (在纯数学中,两者都不对。也许两者都错了?)这些算术运算有更好的解决方案或方法吗?

比较Java中的相等的双重值。

我想从那些在Java中使用原始double相等经验的人那里得到一些建议。 由于可能的舍入误差,将d1 == d2用于两个双精度d1和d2是不够的。 我的问题是: Java的Double.compare(d1,d2) == 0在某种程度上处理舍入错误吗? 如1.7文档中所述,如果d1在数值上等于d2则返回值0 。 是否有人确定它们在数值上是什么意思? 对某些delta值使用相对误差计算,是否会推荐使用delta的通用(非特定于应用程序)值? 请参阅下面的示例。 下面是考虑相对误差来检查相等性的通用函数。 您建议从delta操作+, – ,/,*操作中捕获大部分舍入误差的delta值是多少? public static boolean isEqual(double d1, double d2) { return d1 == d2 || isRelativelyEqual(d1,d2); } private static boolean isRelativelyEqual(double d1, double d2) { return delta > Math.abs(d1- d2) / Math.max(Math.abs(d1), Math.abs(d2)); }