你知道在JavaScript中有两个有效的值可以代表零吗?
positiveZero = +0;
negativeZero = -0;
0 在数学上的意义是某种量的缺失,因此它带不带正负号也是没有意义的。+0 = -0 = 0。但依靠 IEEE 754 标准表达数值的计算机在这方面却有短板。
多数编程语言都有两种零!
IEEE 754 浮点数标准允许 0 带有正负号,也使得 +0 和 -0 可以同时存在。对应的,1 / +0 = +∞ 而 1 / -0 = -∞。这里的正无限和负无限可以理解为数轴两侧的“尽头”。
- +0 和 -0 可以看作两个大小为零但方向相反的向量
- 求一个函数于 +0 或 -0 的极限就是求这个函数从指定方向接近 0 的值(右极限、左极限)
这两种“零”也导致我们在上面的例子中得到了两种不同的“无限”。
IEEE 754 为什么有两种零
无论一个数的大小是否为零,都有一比特表示它的正负。因此当一个负数的大小被设为零,又没有特意变号时,这个数就变成了 -0。
这又有什么关系呢?好吧,JavaScript实现的就是 IEEE 754 标准,本篇文章亦深挖其中的细节。
请注意,JavaScript(和大多数编程语言)的正零(+0)是默认的零值。
JavaScript 中的零
表达
let a = -0;
a; // -0
let b = +0;
b; // 0
如何得到 +0 和 -0
任何数学运算都可能根据操作数的值得到带符号的零(+0 或 -0)。
唯一的例外是 +0 和 -0 互相加减时,
- 两个
-0
相加,结果永远是-0
-0
减去0
结果还是-0
零的其他排列组合都会得到正零。另外需要注意的是,两个非零数相加减永远不会产生负零,即 -3 + 3 = 3 - 3 = +0。
更多例子参考以下代码:
/* 加减运算 */
3 - 3; // 0
-3 + 3; // 0
/* 零零相加 */
-0 + -0; // -0
-