首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查java.lang.Double是否相等的执行方法

检查java.lang.Double是否相等的执行方法
EN

Stack Overflow用户
提问于 2013-07-31 13:04:35
回答 2查看 11K关注 0票数 3

检查双值的最有效的方法是什么?

我能理解

代码语言:javascript
复制
double a = 0.00023d;
double b = 0.00029d;

boolean eq = (a == b);

是缓慢的。

所以我用

代码语言:javascript
复制
double epsilon = 0.00000001d;
eq = Math.abs(a - b) < epsilon;

问题在于,Infinitest正在为花费太多时间的测试提供支持。这没什么大不了的(1秒顶),但这让我很好奇。

附加信息

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

代码语言:javascript
复制
  // 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是这样做的

代码语言:javascript
复制
public boolean equals(Object obj) {
return (obj instanceof Double)
       && (doubleToLongBits(((Double)obj).value) ==
          doubleToLongBits(value));
}

所以人们可以认为这是最好的做法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-31 13:08:36

JUnit有一种检查Double是否与给定的增量“相等”的方法:

代码语言:javascript
复制
Assert.assertEquals(0.00023d, 0.00029d, 0.0001d);

本API文档

正如注释中所指出的,JUnit实际上很可能比手动比较给定的增量要慢。JUnit首先做一个Double.compare(expected, actual) (如果不是相等的话),然后是一个Math.abs(expected - actual) <= delta

希望这个答案仍然对那些没有意识到JUnit实际上为不精确的Double等式测试提供了一种方法的人是有用的。

票数 6
EN

Stack Overflow用户

发布于 2013-08-06 13:21:33

实际上,将两个浮点数/双值进行相等比较本身就是不好的做法,因为浮点数存在舍入错误。两个符号数学中相等的数字可能与计算机不同,这取决于它们是如何计算的。

最佳实践是您使用的第二个选项:Math.abs(a - b) < epsilon

我知道这可能比你想要的要慢,但这是正确的方法。从应用程序的角度来看,按位比较可能会导致两个数字被认为是不同的,尽管它们是相同的(如果您是手工计算的话,它们将是相等的,但是由于舍入错误,它们在位上是不同的)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17971226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档