JavaScript 数值 +0 和 -0 的区分
题目描述
JavaScript 的数值 Number 用 64 位的浮点数表示,首位是符号位,然后是 52 位的整数位和 11 位的小数位。如果符号位为 1,其他各位均为 0,那么这个数值会被表示成 -0。
所以 JavaScript 的 0 值有两个,+0 和 -0。
那么如何区分呢?
解题思路
我们看到 +0
和 -0
,大概想尝试把该数字通过 toString()
转化成字符串,在使用 indexOf('-')
判断是否等于 0
,或者 charAt(0)
判断是否等于 -
。很不幸,数值在进行 toString()
的时候就自动将其转为 0
了,所以此方法行不通。
我们可以尝试另外一个思路,计算机在进行四则及与或模等数值运算时,符号本身也参与运算,JavaScript 亦是如此。而使用0
对一个数做加减操作对本身是无影响的,乘法虽然得到 ±0
的结果,但是又回到了问题本身对 ±0
的判断了,因此我们可以考虑到除法,加上数值本身有 Infinity
和 -Infinity
的区分,分别表示正无穷和负无穷。我们很容易想到使用一个数值来除以 ±0
等到 ±Infinity
。我们使用 -1/0
或 1/-0
都得到 -Infinity
的结果。
同样的,JavaScript提供很多函数供你使用,但结果不外乎都是借助一个数值进行判断。如:Math.pow(-0, -1) === -Infinity
,Math.atan2(-0, -1) === -Math.PI
参考代码
// check the zero is negtive or not, only +0 and -0 can be check
function isNegtiveZero(value) {
if (value !== 0) {
throw new RangeError("The argument must be +0 or -0");
}
return 1 / value === -Infinity;
}
console.log(isNegtiveZero(+0) === false);
console.log(isNegtiveZero(-0) === true);
ECMAScript 2015 添加了一个方法 Object.is
用于对两数值进行比较,可以用于比较 ±0
Object.is(+0, 0) === true;
Object.is(-0, 0) === false;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论