纯粹是出于好奇。
我做了类似的事情:
public static void main(String args[]) throws Exception {
System.out.println(Double.NaN==Double.NaN);
}
输出为false
。不应该返回true
?
为什么会这样?
答案 0 :(得分:5)
来自Java Language Specifications:
浮点运算符不会产生异常(第11节)。一个手术 溢出产生一个有符号的无穷大,一个操作 下溢产生非规范化值或有符号零,和 没有数学上明确结果的操作会产生NaN。所有 以NaN作为操作数的数值运算会产生NaN。如 已经描述过,NaN是无序的,所以进行数值比较 涉及一个或两个NaN的操作返回false和任何!= 涉及NaN的比较返回true,包括x!= x,当x是NaN时。
这里的重要句子是:
所以数字比较 涉及一个或两个NaN的操作返回false
答案 1 :(得分:0)
为了比较两个双打,最好使用#compareTo(Double)
方法,它能够以分开的方式处理NaN
和XXX_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
}