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

4

2 回答 2

14

浮点数据类型有一个保留的特殊值来表示无穷大,整数值没有。

在您的代码1/0中是一个整数除法,当然,它会失败。但是,1/0.0是一个浮点除法,因此导致Infinity.

于 2011-09-10T17:15:58.203 回答
1

严格来说,1.0/0.0根本不是无穷大,它是未定义的。

正如大卫在他的回答中所说,浮点数有一种表达数字的方式,该数字不在它可以表示的最高数字和最低数字的范围内。这些值统称为“非数字”或仅称为 NaN。NaN 也可能来自真正无限的计算(例如)、有限但溢出浮点数可以表示的范围的值(例如 10 100 100)以及未定义的值(例如 1/0)。limx -> 0 ln2 x

浮点数不能很清楚地区分未定义值、溢出和无穷大;该计算产生的位组合取决于。由于对于不知道浮点值如何表示的人来说,仅打印“NaN”或“Not a Number”有点难以理解,因此该格式化程序仅打印“Infinity”或有时“-Infinity”,因为它提供相同的当您知道 FP NaN 的全部内容时的信息级别,并且在您不知道时具有一定的意义。

整数没有任何可与浮点 NaN 相媲美的东西。因为当你做 1/0 时整数没有合理的值,剩下的唯一选择就是引发异常。

用机器语言编写的相同代码可以调用类似于 Java 异常的中断,或者设置一个条件寄存器,这将是一个全局值,表示最后一次计算是被零除。其中哪些可用因平台而异。

于 2011-09-10T17:30:28.023 回答