检查双值的最有效的方法是什么?
我能理解
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));
}所以人们可以认为这是最好的做法。
发布于 2013-07-31 13:08:36
JUnit有一种检查Double是否与给定的增量“相等”的方法:
Assert.assertEquals(0.00023d, 0.00029d, 0.0001d);见本API文档。
正如注释中所指出的,JUnit实际上很可能比手动比较给定的增量要慢。JUnit首先做一个Double.compare(expected, actual) (如果不是相等的话),然后是一个Math.abs(expected - actual) <= delta。
希望这个答案仍然对那些没有意识到JUnit实际上为不精确的Double等式测试提供了一种方法的人是有用的。
发布于 2013-08-06 13:21:33
实际上,将两个浮点数/双值进行相等比较本身就是不好的做法,因为浮点数存在舍入错误。两个符号数学中相等的数字可能与计算机不同,这取决于它们是如何计算的。
最佳实践是您使用的第二个选项:Math.abs(a - b) < epsilon。
我知道这可能比你想要的要慢,但这是正确的方法。从应用程序的角度来看,按位比较可能会导致两个数字被认为是不同的,尽管它们是相同的(如果您是手工计算的话,它们将是相等的,但是由于舍入错误,它们在位上是不同的)。
https://stackoverflow.com/questions/17971226
复制相似问题