Fel*_*ing 182
JavaScript使用IEEE 754标准来表示数字.来自维基百科:
带符号的零为零,带有相关符号.在普通算术中,-0 = + 0 = 0.然而,在计算中,一些数字表示允许存在两个零,通常用-0(负零)和+0(正零)表示.这发生在整数的一些有符号数表示中,并且在大多数浮点数表示中.数字0通常编码为+0,但可以用+0或-0表示.
用于浮点运算的IEEE 754标准(目前大多数计算机和支持浮点数的编程语言使用)都需要+0和-0.零可以被认为是扩展实数线的变体,使得1/-0 =-∞和1/+ 0 = +∞,除以0仅对于±0 /±0和±∞/±∞未定义.
本文包含有关不同表示的更多信息.
所以这就是为什么技术上必须区分零.
但是,
+0 === -0评估结果为true.这是为什么 (...) ?
此行为在第11.9.6节中明确定义,严格的等式比较算法(部分重点是我的):
比较
x === y,其中x和y是值,产生真或假.这样的比较如下进行:(......)
如果Type(x)是Number,那么
- 如果x是NaN,则返回false.
- 如果y是NaN,则返回false.
- 如果x与y的Number值相同,则返回true.
- 如果x是+0且y是-0,则返回true.
- 如果x是-0且y是+0,则返回true.
- 返回false.
(......)
(同样适用于+0 == -0顺便说一句.)
从逻辑上讲,待遇+0和-0平等.否则我们必须在我们的代码中考虑到这一点,我个人不想这样做;)
注意:
ES2015引入了一种新的比较方法,Object.is.Object.is明确区分-0和+0:
Object.is(-0, +0); // false
Run Code Online (Sandbox Code Playgroud)
lak*_*tak 17
我将此作为答案添加,因为我忽略了@ user113716的评论.
您可以通过执行以下操作来测试-0:
function isMinusZero(value) {
return 1/value === -Infinity;
}
isMinusZero(0); // false
isMinusZero(-0); // true
Run Code Online (Sandbox Code Playgroud)
\n\n+0和-0一样吗?
\n
简短的回答:取决于您使用的比较运算符。
\n长答案:
\n基本上,到目前为止我们已经有4 种比较类型:
\nconsole.log(+0 == -0); // true\nRun Code Online (Sandbox Code Playgroud)\nconsole.log(+0 === -0); // true\nRun Code Online (Sandbox Code Playgroud)\nObject.is )console.log(Object.is(+0, -0)); // false\nRun Code Online (Sandbox Code Playgroud)\nconsole.log([+0].includes(-0)); // true\nRun Code Online (Sandbox Code Playgroud)\n结果,只是Object.is(+0, -0)与其他的有所不同。\n
console.log(+0 == -0); // true\nRun Code Online (Sandbox Code Playgroud)\r\n在用于在 JavaScript 中表示 Number 类型的IEEE 754 标准中,符号由一位表示(1 表示负数)。
因此,每个可表示的数字都存在负值和正值,包括 0。
这就是为什么-0和 都+0存在的原因。
我刚刚遇到了一个示例,其中+0和-0的行为确实有很大不同:
Math.atan2(0, 0); //returns 0
Math.atan2(0, -0); //returns Pi
Run Code Online (Sandbox Code Playgroud)
请注意:即使对-0.0001之类的负数使用Math.round时,它实际上也会是-0,并且可能会破坏如上所示的一些后续计算。
解决此问题的快速而肮脏的方法是做类似的事情:
if (x==0) x=0;
Run Code Online (Sandbox Code Playgroud)
要不就:
x+=0;
Run Code Online (Sandbox Code Playgroud)
如果它是-0,则会将数字转换为+0。
| 归档时间: |
|
| 查看次数: |
35679 次 |
| 最近记录: |