检查双精度值是否相等的最有效方法是什么。
我明白那个
double a = 0.00023d;
double b = 0.00029d;
boolean eq = (a == b);
is slow.
所以我正在使用
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;
}
Update
java.lang.Double 就是这样做的
public boolean equals(Object obj) {
return (obj instanceof Double)
&& (doubleToLongBits(((Double)obj).value) ==
doubleToLongBits(value));
}
所以人们可以认为这是最佳实践。
JUnit 有一个方法来检查Double
对于给定增量的“相等”:
Assert.assertEquals(0.00023d, 0.00029d, 0.0001d);
See 这个API文档.
正如评论中所指出的,JUnit 实际上很可能比手动与给定增量进行比较慢。 JUnit 首先做了一个Double.compare(expected, actual)
后跟(如果不相等)Math.abs(expected - actual) <= delta
.
希望这个答案对于那些不知道 JUnit 实际上提供了一种不精确方法的人仍然有用Double
平等测试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)