为什么这个比较会返回错误?

时间:2013-01-30 12:50:52

标签: java

  

可能重复:
  Why does Double.NaN==Double.NaN return false?

纯粹是出于好奇。

我做了类似的事情:

public static void main(String args[]) throws Exception {
        System.out.println(Double.NaN==Double.NaN);
    }

输出为false。不应该返回true

为什么会这样?

2 个答案:

答案 0 :(得分:5)

来自Java Language Specifications

  

浮点运算符不会产生异常(第11节)。一个手术   溢出产生一个有符号的无穷大,一个操作   下溢产生非规范化值或有符号零,和   没有数学上明确结果的操作会产生NaN。所有   以NaN作为操作数的数值运算会产生NaN。如   已经描述过,NaN是无序的,所以进行数值比较   涉及一个或两个NaN的操作返回false和任何!=   涉及NaN的比较返回true,包括x!= x,当x是NaN时。

这里的重要句子是:

  

所以数字比较   涉及一个或两个NaN的操作返回false

答案 1 :(得分:0)

为了比较两个双打,最好使用#compareTo(Double)方法,它能够以分开的方式处理NaNXXX_INFINITY

  

以数字方式比较两个Double对象。有两种方式   通过这种方法进行的比较与通过这种方法进行的比较不同   Java语言数值比较运算符(<,< =,==,> =,>)   当应用于原始双值时:

     

此方法认为Double.NaN等于自身和   大于所有其他双重值(包括   Double.POSITIVE_INFINITY)。   该方法认为0.0d大于-0.0d。这确保了由此强加的Double对象的自然排序   方法与equals一致。

public static void main(String[] args) {
  Double d = new Double(Double.NaN);
  System.out.println(d.compareTo(Double.NaN) == 0);//returns true
}