JavaScript 数值 +0 和 -0 的区分

发布于 2023-03-11 23:00:02 字数 1538 浏览 85 评论 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/01/-0 都得到 -Infinity 的结果。

同样的,JavaScript提供很多函数供你使用,但结果不外乎都是借助一个数值进行判断。如:Math.pow(-0, -1) === -InfinityMath.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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

躲猫猫

暂无简介

文章
评论
575 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文