当我写类似的东西时
double a = 0.0;
double b = 0.0;
double c = a/b;
结果是Double.NaN
,但是当我对整数尝试相同的操作时,它会产生一个ArithmeticException
. 那么,为什么没有Integer.NaN
?
答案与 Java 关系不大。无穷大或未定义的数字不是整数集的一部分,因此它们被排除在外Integer
,而浮点类型表示实数以及复数,因此为了处理这些,NaN
已包含在浮点类型中。
NaN
出于同样的原因,在任何其他语言中都没有整数。
现代计算机使用 2 的补码二进制表示整数,并且该表示没有 NaN 值。(表示类型域中的所有值都表示定整数。)
因此,计算机整数算术硬件无法识别任何 NaN 表示。
理论上,有人可以为包含 NaN(或 INF,或其他一些奇异值)的整数发明一种替代表示。但是,硬件不支持使用这种表示的算术运算。虽然可以在软件中实现它,但在 Java 语言中包含这种支持会非常昂贵1 ......并且在其他方面也是不可取的。
1 - 这当然是相对的,但我预计 NaN 的软件实现将(至少)比硬件慢一个数量级。如果你真的,真的,需要这个,那是可以接受的。但是绝大多数整数算术代码不需要这个。在大多数情况下,为“除以零”抛出异常就可以了,并且在所有整数算术运算中减速一个数量级......是不可接受的。
相比之下:
正如其他评论中所指出的,这主要是因为 NaN 是浮点数的标准值。您可以在此处阅读有关在 Wikipedia 上返回 NaN 的原因:
http://en.wikipedia.org/wiki/NaN
请注意,整数仅存在这些原因之一(除以零)。整数没有的浮点数也有正无穷大和负无穷大值,并且与浮点规范中的 NaN 密切相关。