Java System.out.println(0.0%0.0!=0.0/0.0);会有什么结果?你能解释一下答案吗?
我正在研究OCJP问题,我发现了这个奇怪的代码:Java System.out.println(0.0%0.0!=0.0/0.0);会有什么结果?你能解释一下答案吗?,java,Java,我正在研究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 f
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.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和any=
涉及NaN的比较返回true,包括x=当x为NaN时为
更多信息:
它们在我看来根本不一样。或者更确切地说,它们看起来就像3/4
和3**4
一样,为什么你认为这个等式应该是真的呢?有趣的是,字节码是:0:getstatic#16//字段java/lang/System.out:Ljava/io/PrintStream;3:iconst#u 14:invokevirtual#22//方法java/io/PrintStream.println:(Z)v7:getstatic#16//字段java/lang/System.out:Ljava/io/PrintStream;10:iconst_0 11:invokevirtual#22//方法java/io/PrintStream.println:(Z)v14:return。。。我不明白为什么0
和1
被加载到堆栈中。