0、-0和+0之间的区别

3
我从未理解为什么-0会与0不同对待。
有趣的事实是,0等于-0
> 0 === -0
true

那么问题来了:为什么 -0 会与 0+0 不同?这里有解释。
在什么情况下,0 前面的符号会有所不同?
在数学中,+0 是略大于 0 的值。同样地,-0 是略小于 0 的值。例如:n / Infinity 将返回 +0,而 n / -Infinity 将返回 -0(假设 n 是一个大于 0 的实数)。这在数学中是成立的。

我认为答案可能是,因为这就是语言规定应该如何处理的方式。 - Liam
3
该定义可在http://en.wikipedia.org/wiki/IEEE_754找到。简单的原因是,在内存中的二进制表示中有一个位用于定义数字的符号。由于这个事实,所有表示的数字都可以是正数或负数(组合地)。 - Laszlo Korte
我可能错了,但是-0+0不是将其解析为数字吗?所以它基本上相当于Number(-0)Number(0) - Dom
如果在 JavaScript 中将算术运算符添加到任何类型中,它就会变成一个数字。因此,如果将其添加到数字中,它仍然是一个数字。 - A1rPun
1
首先,不存在三个零:只有两个:+0和-0。 - GameAlchemist
显示剩余6条评论
1个回答

1

"复数初等函数的分支切割或无关紧要的符号位"讨论了有符号零的原因。这种分析启发了IEEE-754标准,成为现代大多数指令集和编程语言浮点数行为的基础。

简而言之,许多常见的数字函数可以在有符号零的地方连续,而在无符号零的地方则不能,从而减少NaN值和特殊情况。除法就是其中之一。


那么,问题是:为什么-0与0和+0分别处理?
只要明确,只有两个零值。 -0和+0。可以将标记(0)替换为标记(+0),无需更改语义。

The interesting fact is that 0 is equal with -0

0 === -0
true
这种行为是由IEEE-754规定的。
要测试两个数值是否“相同”:
function same(x, y) {
  if (x === y) {
    if (x !== 0) {
      return true;  // Non-zero values.
    } else {
      return (1/x === 1/y);  // Test signed-ness of zeroes.
    }
  } else {
    return x !== x && y !== y;  // Treat NaNs the same
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接