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)
因此可以认为这是最佳做法。
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相等测试提供方法的人仍然有用。
| 归档时间: |
|
| 查看次数: |
9692 次 |
| 最近记录: |