我正在研究OCJP问题,我发现了这个奇怪的代码:
public class abc {
public static void main(String[] args) {
System.out.println(0.0%0.0!=0.0/0.0);// it return true
System.out.println(0.0%0.0==0.0/0.0);// it return false
}
}
当我运行代码时,我得到了:
true
false
当我们比较两个看起来彼此相同的东西时,输出是如何错误的? NaN是什么意思?
答案 0 :(得分:3)
0.0 / 0.0
和0.0 % 0.0
都返回Double.NaN
。
如果您比较Double.NaN == Double.NaN
,您将收到false
,这就是System.out.println(0.0%0.0==0.0/0.0);
打印false
的原因。
现在的问题是为什么Double.NaN == Double.NaN
会返回false
?
根据JLS:
浮点运算符不会产生异常(第11节)。一个手术 溢出产生一个有符号的无穷大,一个操作 下溢产生非规范化值或有符号零,和 没有数学上明确结果的操作会产生NaN。所有 以NaN作为操作数的数值运算会产生NaN。如 已经描述过,NaN是无序的,所以进行数值比较 涉及一个或两个NaN的操作返回false和任何!= 涉及NaN的比较返回true,包括x!= x,当x是NaN时。
更多信息: