60

在我看来,代码

console.log(1 / 0)

应该返回NaN,而是返回Infinity。但是这段代码:

console.log(0 / 0)

确实返回NaN。有人可以帮我理解这个功能的原因吗?不仅看起来不一致,而且似乎是错误的,在x / 0wherex !== 0

4

3 回答 3

40

因为这就是定义浮点的方式(更普遍地不仅仅是 Javascript)。参见例如:

粗略地说,您可以将 1/0 视为 1/x 的极限,因为 x 趋于零(从右侧开始)。并且 0/0 根本没有合理的解释,因此是 NaN。

于 2013-09-16T22:26:51.720 回答
11

除了基于零的数学概念的答案之外,还有一个对浮点数的特殊考虑。每个下溢结果,每个绝对幅度太小而无法表示为非零数的非零数都表示为零。

0/0 可能实际上是 1e-500/1e-600,或 1e-600/1e-500,或许多其他非常小的值的比率。

实际比率可以是任何值,因此没有有意义的数字答案,结果应该是 NaN。

现在考虑 1/0。0 代表 1e-500 还是 1e-600 无关紧要。无论如何,除法会溢出,正确的结果是用于表示溢出的值 Infinity。

于 2013-09-17T02:25:23.537 回答
5

我意识到这是旧的,但我认为重要的是要注意,在 JS 中还有一个-0不同于0+0使 JS 的这个特性比乍一看更合乎逻辑的东西。

1 / 0 -> Infinity
1 / -0 -> -Infinity 

这在逻辑上是有道理的,因为在微积分中,除以 0 的原因是未定义的,仅仅是因为左极限趋于负无穷,右极限趋于正无穷。由于-0and是 JS 中的不同对象,因此将正 0 用于评估为正,将负 0 用于评估为负0是有意义的InfinityInfinity

此逻辑不适用于0/0,这是不确定的。与 with 不同1/0,我们可以通过这种方法得到两个带有限制的结果0/0

lim h->0(0/h) = 0
lim h->0(h/0) = Infinity

这当然是不一致的,所以它会导致 NaN

于 2017-04-14T07:03:00.677 回答