double d=1/0.0;
System.out.println(d);
它打印Infinity
,但是如果我们写double d=1/0;
并打印它我们会得到这个例外:Exception
in thread "main" java.lang.ArithmeticException: / by zero
at D.main(D.java:3)
为什么Java在一种情况下知道潜水为零是无穷大但是对于int 0它没有定义?
在这两种情况下,d都是双倍的,在两种情况下,结果都是无穷大。
答案 0 :(得分:14)
浮点数据类型具有保留用于表示无穷大的特殊值,而不包含整数值。
在您的代码中1/0
是一个整数除法,当然会失败。但是,1/0.0
是一个浮点除法,因此导致Infinity
。
答案 1 :(得分:1)
1.0/0.0
根本不是无限的,它是未定义的。
正如大卫在他的回答中所说,Floats有一种表达一个数字的方式,该数字不在它可以代表的最高数字范围内,而是最低数字。这些值统称为“非数字”或仅仅是NaN。 NaNs也可以来自真正无限的计算(例如limx -> 0 ln2 x
),这些值是有限的但溢出浮点数可以表示的范围(如10 100 100 ),以及未定义的值,如1/0。
浮点数不能很清楚地区分未定义的值,溢出和无穷大;该计算产生的比特组合取决于。由于只是打印“NaN”或“非数字”对于不知道如何表示浮点值的人来说有点难以理解,因此格式化程序只打印“Infinity”或有时“-Infinity”,因为它提供相同的知道FP NaN的所有信息时的信息水平,并且当你不了解FP NaN时有一些意义。
整数没有任何可与浮点NaN相媲美的东西。因为当你执行1/0时,整数没有合理的值,所以剩下的唯一选择是引发异常。
用机器语言编写的相同代码可以调用与Java异常相当的中断,也可以设置条件寄存器,这将是一个全局值,表示最后一次计算是除以零。其中哪些可用的平台有点不同。