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

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

我明白那个

double a = 0.00023d;

double b = 0.00029d;

boolean eq = (a == b);

是慢的。

所以我在用

double epsilon = 0.00000001d;

eq = Math.abs(a - b) < epsilon;


问题在于,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;

}

java.lang.Double就是这样

public boolean equals(Object obj) {

return (obj instanceof Double)

&& (doubleToLongBits(((Double)obj).value) ==

doubleToLongBits(value));

}

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

回答:

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

Assert.assertEquals(0.00023d, 0.00029d, 0.0001d);

请参阅此API文档。

如评论中所述,JUnit实际上很可能比手动比较给定的增量慢。JUnit首先执行Double.compare(expected,

actual)(如果不相等),后跟一个Math.abs(expected - actual) <= delta

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

以上是 检查java.lang.Double是否相等的高性能方法 的全部内容, 来源链接: utcz.com/qa/427931.html

回到顶部