Python中文网

一个关于 编程问题的解答网站.

有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

双值assertEquals的delta或epsilon参数的java含义

我有一个关于JUnit assertEquals的问题,需要测试double值。阅读API doc我可以看到:

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

Deprecated. Use assertEquals(double expected, double actual, double delta) instead.

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

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


共 (3) 个答案

  1. # 1 楼答案

    浮点计算是不精确的——通常存在舍入误差,以及由于表示而产生的误差。(例如,0.1不能用二进制浮点精确表示。)

    因此,直接比较两个浮点值是否相等通常不是一个好主意,因为它们可能会有少量差异,这取决于它们的计算方式

    在JUnit javadocs中被称为“delta”,它描述了你可以容忍的数值差异量,它们仍然被认为是相等的。此值的大小完全取决于要比较的值。比较双精度时,我通常使用预期值除以10^6

  2. # 2 楼答案

    ε是两个数字可以关闭的值。所以只要Math.abs(expected - actual) <= epsilon它就会断言为真

  3. # 3 楼答案

    请注意,如果你不做数学,断言精确的浮点值没有错。例如:

    public interface Foo {
        double getDefaultValue();
    }
    
    public class FooImpl implements Foo {
        public double getDefaultValue() { return Double.MIN_VALUE; }
    }
    

    在本例中,您需要确保它确实是MIN_VALUE,而不是零或-MIN_VALUEMIN_NORMAL或其他非常小的值。你可以说

    double defaultValue = new FooImpl().getDefaultValue();
    assertEquals(Double.MIN_VALUE, defaultValue);
    

    但这会给你一个反对的警告。为了避免这种情况,您可以调用assertEquals(Object, Object)

    // really you just need one cast because of autoboxing, but let's be clear
    assertEquals((Object)Double.MIN_VALUE, (Object)defaultValue);
    

    如果你真的想看起来聪明点:

    assertEquals(
        Double.doubleToLongBits(Double.MIN_VALUE), 
        Double.doubleToLongBits(defaultValue)
    );
    

    或者你也可以使用Hamcrest流畅的风格断言:

    // equivalent to assertEquals((Object)Double.MIN_VALUE, (Object)defaultValue);
    assertThat(defaultValue, is(Double.MIN_VALUE));
    

    但是,如果你检查的值确实来自于做一些数学运算,那么使用ε