看到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
的魔力是什么?为什么它不会抛出异常?
答案 0 :(得分:11)
“神奇”是Java浮点表示基于IEE 754 floating point标准。它有一个特殊值(NaN),表示零除以零时得到的“不确定值”。 (也有代表正负无穷大的值;例如1.0 / 0.0
给出INF
- 正无穷大。)
Java语言规范中对此进行了介绍;请参阅讨论表示的§4.2.3部分和讨论算术如何工作的§4.2.4。
请注意,相同的“魔力”适用于float
,double
,Float
和Double
。
答案 1 :(得分:1)
因为数字系统中未定义的内容无法明确表示。 “Undefined”不是数字(NaN),而double / float有NaN来表示。
“算术格式:二进制和十进制浮点数据集,由有限数(包括有符号零和次正规数),无穷大和特殊”非数字“值(NaN)组成”
答案 2 :(得分:1)
Java中的双打(以及一些但不是所有其他语言)支持NaN(非数字)的值。
除以0之类的操作会给你一个NaN的双倍。
任何涉及NaN的操作也会产生NaN。
维基百科有关于NaN主题的整页: