首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >双值assertEquals的δ或epsilon参数的意义

双值assertEquals的δ或epsilon参数的意义
EN

Stack Overflow用户
提问于 2011-04-16 13:18:22
回答 8查看 188.8K关注 0票数 212

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

@废弃的公共静态无效assertEquals(双重预期,双实际) 不推荐。使用assertEquals(double expected, double actual, double delta)代替。

(注意:在较早的文档版本中,增量参数称为epsilon)

delta (或epsilon)参数是什么意思?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-04-16 13:20:08

Epsilon是这两个数字可以减去的值。所以只要是Math.abs(expected - actual) <= epsilon,它就会断言为真

票数 227
EN

Stack Overflow用户

发布于 2011-12-05 12:33:20

这是什么版本的JUnit?我只看过三角洲,没见过埃西龙-但这是个附带的问题!

来自JUnit javadoc

达美-预期和实际之间的最大增量,对于这两个数字仍然被认为是相等的。

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

代码语言:javascript
运行
复制
private static final double DELTA = 1e-15;

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

如果您使用的是汉克雷斯特断言,您只需使用标准的双倍equalTo() (它不使用增量)。然而,如果您想要一个增量,您可以只使用closeTo() (参见javadoc)。

代码语言:javascript
运行
复制
private static final double DELTA = 1e-15;

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

FYI即将到来的JUnit 5也将在用两个双打调用assertEquals()时使用使delta可选实现 (如果您感兴趣的话)是:

代码语言:javascript
运行
复制
private static boolean doublesAreEqual(double value1, double value2) {
    return Double.doubleToLongBits(value1) == Double.doubleToLongBits(value2);
}
票数 130
EN

Stack Overflow用户

发布于 2011-04-16 13:29:26

浮点计算并不准确--经常会出现舍入误差,以及由于表示而产生的误差.(例如,0.1不能完全用二进制浮点数表示)。

正因为如此,直接比较两个浮点的相等值通常不是一个好主意,因为根据计算的方式,它们可以相差很小。

“增量”在JUnit javadocs中称为“增量”,它描述了您可以容忍的值中的差异,以便它们仍然被认为是相等的。这个值的大小完全取决于您正在比较的值。当比较双值时,我通常使用预期值除以10^6。

票数 58
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5686755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档