在JavaScript中,为什么零除以零返回NaN,但任何其他除以零返回无穷大?

时间:2013-09-16 22:23:39

标签: javascript math floating-point nan infinity

在我看来,代码

console.log(1 / 0)

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

console.log(0 / 0)

返回NaN。有人可以帮我理解这个功能的原因吗?在x / 0 x !== 0

的情况下,它不仅似乎不一致,而且似乎也是错误的

3 个答案:

答案 0 :(得分:31)

因为这是浮点定义的方式(更通常不仅仅是Javascript)。例如见:

粗略地说,您可以将1/0视为1 / x的限制,因为x趋于零。并且0/0根本没有合理的解释,因此NaN。

答案 1 :(得分:9)

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

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

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

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

答案 2 :(得分:4)

我意识到这已经过时了,但我认为重要的是要注意,在JS中还有-00+0不同,这使得JS的特征比初看起来更合乎逻辑。

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

这在逻辑上是有道理的,因为在微积分中,除以0的原因未定义仅仅是因为左边界限为负无穷大而右边界限为正无穷大。由于-00是JS中的不同对象,因此将正0应用于评估为正Infinity而将负0应用于评估为负Infinity <是有意义的/ p>

此逻辑不适用于0/0,这是不确定的。与1/0不同,我们可以通过此方法使用0/0

获得两个限制结果
lim h->0(0/h) = 0
lim h->0(h/0) = Infinity

当然是不一致的,因此导致NaN