当两个值都是double时,为什么没有ArithmeticException(除以零)?

时间:2013-12-17 11:17:52

标签: java android exception math

看到Double.java的源代码和一些常量就像

/**
 * Constant for the Not-a-Number (NaN) value of the {@code double} type.
 */
public static final double NaN = 0.0 / 0.0;

/**
 * Constant for the positive infinity value of the {@code double} type.
 */
public static final double POSITIVE_INFINITY = 1.0 / 0.0;

/**
 * Constant for the negative infinity value of the {@code double} type.
 */
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;

但我想知道它为什么不抛出ArithmeticException(除以零)?

我试过

 public static final int VALUE = 0/0;

现在它正在抛出异常,但是当我说

 public static final double VALUE = 0d/0d;

它没有抛出异常...

Double的魔力是什么?为什么它不会抛出异常?

3 个答案:

答案 0 :(得分:11)

“神奇”是Java浮点表示基于IEE 754 floating point标准。它有一个特殊值(NaN),表示零除以零时得到的“不确定值”。 (也有代表正负无穷大的值;例如1.0 / 0.0给出INF - 正无穷大。)

Java语言规范中对此进行了介绍;请参阅讨论表示的§4.2.3部分和讨论算术如何工作的§4.2.4


请注意,相同的“魔力”适用于floatdoubleFloatDouble

答案 1 :(得分:1)

因为数字系统中未定义的内容无法明确表示。 “Undefined”不是数字(NaN),而double / float有NaN来表示。

IEEE 754

“算术格式:二进制和十进制浮点数据集,由有限数(包括有符号零和次正规数),无穷大和特殊”非数字“值(NaN)组成”

答案 2 :(得分:1)

Java中的双打(以及一些但不是所有其他语言)支持NaN(非数字)的值。

除以0之类的操作会给你一个NaN的双倍。

任何涉及NaN的操作也会产生NaN。

维基百科有关于NaN主题的整页:

http://en.wikipedia.org/wiki/NaN