首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较双值

问比较双值
EN

Stack Overflow用户
提问于 2015-11-28 21:40:21
回答 3查看 27.7K关注 0票数 3

我有两个双重值。我想检查两个双精度值是否相同。我有两种方法来比较这个双精度值。

第一种方法:

代码语言:javascript
复制
double a = 0.1;
double b = 0.2;
if(a == b) {
    System.out.println("Double values are same");
}

另一种比较的方法是:

代码语言:javascript
复制
if(Double.compare(a, b) == 0) {
    System.out.println("Double values are same");
}

哪种方法是最好的,也是准确的?对于比较双精度值,这两种方法是否相同?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-28 21:46:50

Double.compare处理NaN和负零的方式与==不同。对于Double.compare,-0.0d不等于0.0d。

例如下面的代码:

代码语言:javascript
复制
public static void main(String... args) {
    double a = -0.0d;
    double b = 0.0d;
    if (a == b) {
        System.out.println("a == b");
    }
    if (Double.compare(a, b) == 0) {
        System.out.println("Double.compare(a, b) == 0");
    }
}

将仅打印a == b。

因此,这两个操作是不等价的。根据您的需求使用一个或另一个。

关于== (和!=)的确切规则可以在JLS、section 15.21.1中找到。

根据IEEE754标准的规则执行

浮点相等测试:

  • 如果任一操作数为NaN,则==的结果为false,但!=的结果为true。实际上,测试x!=x是真的,当且仅当x的值是NaN.
  • Positive零并且负零被视为相等运算符将两个不同的浮点值视为不相等。特别是,有一个值表示正无穷大,一个值表示负无穷大;每个值都只与自身相等,而每个值与所有其他值都不相等。

根据浮点数的这些注意事项,以下规则适用于整数操作数或NaN以外的浮点操作数:

  • 如果左操作数的值等于右操作数的值,则==运算符生成的值为true;否则,结果为false。
  • 如果左操作数的值不等于右操作数的值,则!=运算符生成的值为true;否则,结果为false。
票数 9
EN

Stack Overflow用户

发布于 2015-11-28 21:49:40

让我们分析一下这部分:

代码语言:javascript
复制
if(Double.compare(a, b) == 0)

通过查看Double.compare的documentation,一个可能的实现可能如下所示(显然它将是一个更优化的实现,但这只是为了讨论):

代码语言:javascript
复制
return a == b ? 0 : (a < b ? -1 : +1);

然后,你有另一个比较,所以它变成:

代码语言:javascript
复制
if((a == b ? 0 : (a < b ? -1 : +1))  == 0)

在另一种情况下,您可以使用==进行简单的比较,即:

代码语言:javascript
复制
if(a == b)

也就是说,就精度而言,我猜结果是相同的,因为double的底层表示不会改变,与0的比较似乎不会影响精度。

哪一个是最好的?

好吧,从上面的例子中,我会说更简单的直接比较值,你只对相等感兴趣,即使你不太可能面临一个问题,这将受益于选择这样的比较的最佳方法。无论如何,当您不仅对相等感兴趣,而且对大于和/或小于的概念感兴趣时,使用Double.compare的方法更适合这些情况。

票数 3
EN

Stack Overflow用户

发布于 2015-11-28 21:48:03

这两个选项对于检查两个数字是否相等都是完全有效的。我个人会说==更好,但这只是我个人的看法。

当你想知道为什么你的变量不相等时,double.compare()更好。它返回的信息比true或false多一点-如果左侧较小,则返回负值;如果右侧较小,则返回正值。

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

https://stackoverflow.com/questions/33971989

复制
相关文章

相似问题

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