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

问题描述 投票:0回答:5

在我看来,代码

console.log(1 / 0)

应该返回

NaN
,但它却返回
Infinity
。然而这段代码:

console.log(0 / 0)

确实返回

NaN
。有人可以帮助我理解此功能的原因吗?它不仅看起来不一致,而且似乎也是错误的,在
x / 0
的情况下,其中
x !== 0

javascript math floating-point nan infinity
5个回答
43
投票

因为这就是浮点的定义方式(比 JavaScript 更普遍)。参见示例:

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


12
投票

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

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

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

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


5
投票

我意识到这已经很旧了,但我认为值得注意的是,在 JS 中还有一个

-0
,它与
0
+0
不同,这使得 JS 的这个功能比乍一看更加合乎逻辑。

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

这在逻辑上是有意义的,因为在微积分中,除以 0 是未定义的,仅仅是因为左极限为负无穷大,右极限为正无穷大。由于

-0
0
在 JS 中是不同的对象,因此应用正 0 来评估正
Infinity
和负 0 评估负
Infinity

是有意义的

这个逻辑不适用于

0/0
,它是不确定的。与
1/0
不同,我们可以通过
0/0

的方法得到两个取极限的结果
lim h->0(0/h) = 0
lim h->0(h/0) = Infinity

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


1
投票

在数学中,除法可以被认为是乘法的逆运算。当您将一个数字 a 除以另一个数字 b 时,您实际上是在尝试找出 b 可以放入 a 中多少次。然而,当您尝试除以零时,您是在问数字 a 可以容纳多少次零。由于零没有任何价值,因此不能用它来衡量它可以容纳任何数字的次数。这种情况在数学中造成了未定义或不确定的状态。

但是,在 JavaScript 和 IEEE 754 浮点标准 的上下文中,除以零的处理方式有所不同。当您将正数(例如 1)除以零时,结果是Infinity。这是因为,根据 IEEE 754 标准,数系扩展为正无穷大和负无穷大,从而允许计算极限。

这样想:当除数接近零时,除法的结果会无限增大。换句话说,结果接近无穷大。这就是为什么在 JavaScript(以及遵循 IEEE 754 标准的其他编程语言)中,正数除以零会得到无穷大


0
投票

在微积分中,当您开始评估极限时,您会了解到,当 x 接近垂直渐近线时,垂直渐近线的极限会无限增加,或者,在极限表示法中,计算结果为无穷大。同时,0/0 被视为不确定形式。

因此,JavaScript 的推理基于极限微积分,而不是代数。

© www.soinside.com 2019 - 2024. All rights reserved.