检查java.lang.Double是否相等的高性能方法

mik*_*ike 1 java double comparison junit infinitest

检查双精度值是否相等的最有效方法是什么。

我明白那个

double a = 0.00023d;
double b = 0.00029d;

boolean eq = (a == b);
Run Code Online (Sandbox Code Playgroud)

是缓慢的。

所以我在用

double epsilon = 0.00000001d;
eq = Math.abs(a - b) < epsilon;
Run Code Online (Sandbox Code Playgroud)

问题是,Infinitest抱怨太多的测试时间。没什么大不了的(最高1秒),但这让我感到好奇。

附加信息

a硬编码,因为它是期望值,b

  // fyi: current = int, max = int
  public double getStatus()
  {
    double value = 0.0;
    if (current != 0 && max != 0)
      value = ((double) current) / max;
    return value;
  }
Run Code Online (Sandbox Code Playgroud)

更新资料

java.lang.Double就是这样

public boolean equals(Object obj) {
return (obj instanceof Double)
       && (doubleToLongBits(((Double)obj).value) ==
          doubleToLongBits(value));
}
Run Code Online (Sandbox Code Playgroud)

因此可以认为这是最佳做法。

drv*_*ijk 5

JUnit有一种检查Double给定delta的“相等性” 的方法:

Assert.assertEquals(0.00023d, 0.00029d, 0.0001d);
Run Code Online (Sandbox Code Playgroud)

请参阅此API文档

如评论中所述,JUnit实际上最有可能比手动比较给定的增量慢。JUnit首先执行Double.compare(expected, actual)(如果不相等),后跟一个Math.abs(expected - actual) <= delta

希望这个答案对于那些不知道JUnit实际上为不精确的Double相等测试提供方法的人仍然有用。

  • [Grepcode org.junit.Assert](http://grepcode.com/file/repository.springsource.com/org.junit/com.springsource.org.junit/4.8.1/org/junit/Assert.java#Assert .assertEquals%28java.lang.String%2Cdouble%2Cdouble%2Cdouble%29)。它是先完成“慢”测试,再进行“快速”测试的组合。您将不会从中学到任何东西。 (2认同)