在我看来,代码
console.log(1 / 0)
应该返回NaN
,而是返回Infinity
。但是这段代码:
console.log(0 / 0)
确实返回NaN
。有人可以帮我理解这个功能的原因吗?不仅看起来不一致,而且似乎是错误的,在x / 0
wherex !== 0
在我看来,代码
console.log(1 / 0)
应该返回NaN
,而是返回Infinity
。但是这段代码:
console.log(0 / 0)
确实返回NaN
。有人可以帮我理解这个功能的原因吗?不仅看起来不一致,而且似乎是错误的,在x / 0
wherex !== 0
因为这就是定义浮点的方式(更普遍地不仅仅是 Javascript)。参见例如:
粗略地说,您可以将 1/0 视为 1/x 的极限,因为 x 趋于零(从右侧开始)。并且 0/0 根本没有合理的解释,因此是 NaN。
除了基于零的数学概念的答案之外,还有一个对浮点数的特殊考虑。每个下溢结果,每个绝对幅度太小而无法表示为非零数的非零数都表示为零。
0/0 可能实际上是 1e-500/1e-600,或 1e-600/1e-500,或许多其他非常小的值的比率。
实际比率可以是任何值,因此没有有意义的数字答案,结果应该是 NaN。
现在考虑 1/0。0 代表 1e-500 还是 1e-600 无关紧要。无论如何,除法会溢出,正确的结果是用于表示溢出的值 Infinity。
我意识到这是旧的,但我认为重要的是要注意,在 JS 中还有一个-0
不同于0
或+0
使 JS 的这个特性比乍一看更合乎逻辑的东西。
1 / 0 -> Infinity
1 / -0 -> -Infinity
这在逻辑上是有道理的,因为在微积分中,除以 0 的原因是未定义的,仅仅是因为左极限趋于负无穷,右极限趋于正无穷。由于-0
and是 JS 中的不同对象,因此将正 0 用于评估为正,将负 0 用于评估为负0
是有意义的Infinity
Infinity
此逻辑不适用于0/0
,这是不确定的。与 with 不同1/0
,我们可以通过这种方法得到两个带有限制的结果0/0
lim h->0(0/h) = 0
lim h->0(h/0) = Infinity
这当然是不一致的,所以它会导致 NaN