【问题标题】:Assert Equals (double, double, delta) IssueAssertequals (double, double, delta) 问题
【发布时间】:2025-12-12 03:35:01
【问题描述】:

我正在尝试创建一个断言等于 (double, double, epsilon) 方法。我创建了它,由于某种原因,当我运行我的测试器时,该方法失败了。

public static void assertEquals(double expect, double actual, double epsilon){
    totalAssertMethods ++;
    double difference = (Math.abs(expect - actual));
    if (difference <= epsilon){

    } else {
        totalAssertMethodsFailures ++;
        Throwable throwable = new Throwable("Error: Expected X +/-E, found Y");
        throwable.printStackTrace();
    }
}

我认为问题在于,测试中期望和实际之间的差异仅与 epsilon 相差约 0.000001。有谁知道如何解决这个问题?

【问题讨论】:

  • 你的输入值是多少?
  • 预期 = 0.123456 和实际 = 0.1234571
  • 这是否意味着您的方法确实有效?差值为 0.0000011 (> 0.000001)。但由于舍入误差,这种比较总是很棘手。
  • 我希望这个失败,我有一个计数器可以计算失败的测试,它预计会有四个,但它会将这个计算为通过测试,所以我收到一个错误,说测试失败是一个短.

标签: java double assert epsilon


【解决方案1】:

尝试将您的值四舍五入到一定的精度:

double difference = Math.round(Math.abs(expect - actual) * 100000D) / 100000D;

对 epsilon 也做同样的事情。

double finalEpsilon = Math.round(epsilon * 100000D) / 100000D;

【讨论】:

  • 你能分享differencefinalEpsilon的值吗?
  • 差异 = -0.0000011 最终 epsilon = 0.000001
  • 在上述情况下,difference 是 -ve,epsilon 是 +ve,因此它将进入 if 条件而不是 else。尝试使用Math.round 对结果进行四舍五入。解决方案已更新。
  • 想通了,由于某种原因,当我保存我的文件时,它并没有过度写入我的旧文件,所以当我编译时,同样的错误不断出现。很抱歉给大家带来不便,但感谢您的好建议!
【解决方案2】:

有点晚了,但可能对其他人有用:您现在可以使用 assertj AbstractDoubleAssert

assertThat(actual).isCloseTo(expected, Percentage.withPercentage(0.999999));

【讨论】:

    最近更新 更多