double d = 1 / 0.0 vs double d = 1/0

时间:2011-09-10 17:14:29

标签: java double infinity

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都是双倍的,在两种情况下,结果都是无穷大。

2 个答案:

答案 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异常相当的中断,也可以设置条件寄存器,这将是一个全局值,表示最后一次计算是除以零。其中哪些可用的平台有点不同。