断言的增量或 epsilon 参数的含义双精度值的等式

2022-08-31 06:05:32

我有一个关于JUnit来测试值的问题。阅读API文档,我可以看到:assertEqualsdouble

@Deprecated
public static void assertEquals(double expected, double actual)

荒废的。请改用。assertEquals(double expected, double actual, double delta)

(注意:在较旧的文档版本中,delta 参数称为 epsilon)

(或 )参数是什么意思?deltaepsilon


答案 1

Epsilon 是 2 个数字可以关闭的值。因此,只要Math.abs(expected - actual) <= epsilon


答案 2

这是哪个版本的JUnit?我只见过delta,而不是epsilon - 但这是一个小问题!

来自 JUnit javadoc

delta - 预期和实际之间的最大增量,两个数字仍然被视为相等。

这可能有点过分,但我通常使用一个非常小的数字,例如

private static final double DELTA = 1e-15;

@Test
public void testDelta(){
    assertEquals(123.456, 123.456, DELTA);
}

如果您使用的是 hamcrest 断言,则可以只使用带有两个双精度的标准(它不使用 delta)。但是,如果你想要一个delta,你可以只使用(参见javadoc),例如equalTo()closeTo()

private static final double DELTA = 1e-15;

@Test
public void testDelta(){
    assertThat(123.456, equalTo(123.456));
    assertThat(123.456, closeTo(123.456, DELTA));
}

仅供参考,即将推出的JUnit 5也将在使用两个双打时使delta可选实现(如果你感兴趣的话)是:assertEquals()

private static boolean doublesAreEqual(double value1, double value2) {
    return Double.doubleToLongBits(value1) == Double.doubleToLongBits(value2);
}