Javascript 区分+;0和-0

Javascript 区分+;0和-0,javascript,Javascript,结果表明,+0===-0的计算结果为true,尽管+0和-0是不同的实体。那么,如何区分+0和-0 有一个黑客: if (1 / myZero > 0) { // myZero is +0 } else { // myZero is -0 } 我能做得更好吗?这仍然是一种黑客行为,但看看规格说明就知道: Math.atan2(0, -0) === Math.PI // true Math.atan2(0, 0) === 0 // true 这将返回+0: -0

结果表明,
+0===-0
的计算结果为
true
,尽管
+0
-0
是不同的实体。那么,如何区分
+0
-0

有一个黑客:

if (1 / myZero > 0) {
   // myZero is +0
} else {
   // myZero is -0
}

我能做得更好吗?

这仍然是一种黑客行为,但看看规格说明就知道:

Math.atan2(0, -0) === Math.PI // true
Math.atan2(0,  0) === 0       // true
这将返回+0:

-0 + 0
这无助于区分-0和+0,但有助于确保某些值不是-0

1 / -0       => -Infinity  
1 / (-0 + 0) => Infinity
根据,将1除以0将产生相应的无穷大,然后可用于等式检查:

1 / 0
> Infinity
1 / -0
> -Infinity
下面是无穷大的等式比较的行为:

Infinity === -Infinity
> false
Infinity === Infinity
> true
-Infinity === Infinity
> false
-Infinity === -Infinity
> true

在ECMAScript 6中,Object.is的行为类似于
=
,只是它区分正零和负零,并且
Object.is(NaN,NaN)
的计算结果为
。(请参阅以获取写入信息。)


Chrome 24支持Object.is

,因为人们似乎很难理解它的实际需求是什么:这是我的用例

我需要一个解决方案来按索引对表中的列进行排序。单击
并使用[ordinal]调用分拣机进行升序,使用-[ordinal]进行降序。第一列将给出降序的
-0
,或升序的
0

所以我需要区分
+0
-0
,并在这里结束。对我有效的解决方案在@Šime Vidas的评论中,但在某种程度上被隐藏了起来


[已删除部分-请参阅下面的注释]

要使用Node.js中的一个直接选项


此外,您还可以轻松浏览它们。

要检查负零,这里有一个简单的解决方案

function isNegativeZero(n) {
    n = Number( n );
    return (n === 0) && (1 / n === -Infinity);
}

正如Matt Fenwick所暗示的,您可以(使用var
zero
)执行以下操作:

使用
Math.sign()



你为什么要知道这些?(不是居高临下……我真的很好奇!)你的解决方案似乎是合理的。(+0==-0)为真似乎是语言中的一个疏忽,所以我不知道你还能如何解决它。我不希望它经常出现。@evan,这不是疏忽,这是IEEE 754所要求的。您不需要函数,只需执行以下检查:
if(1/x>0){…
@Jason:我只是在玩弄这些规范,并考虑进行一系列思维实验。这些奇怪的事情可能会导致难以发现的bug。看看我的一个担心:你指的是哪些规范?ECMAScript?(毫无疑问,我只是想知道…)Jared Farrish:是的,代码< ATAN2。你有链接吗?谢谢,伙计。这是为了我自己的启发。(注意,PIMVDB的引用被发现)它工作,但是在我的Chrome上比x> 1 /0/<代码>测试者慢了10倍。你可以使用<代码>数学。ABS(-0)。这对我来说非常有用,因为我需要特别确保零为正,但不要使用其他有符号的数字。如果旧浏览器需要ECMAScript 5,在结尾还有一个替代版本。这并不适用于所有数字:
1/-5e-324
导致
-Infinity
,但
-5e-324==-0
是假的。@TimothyGu你的观点是什么?这个问题专门问+0和-0,而不是“每个数字”。当然是真的。我不好忘记原来的问题。使用TypedArray:
isPosZero=x=>!(新的Uint8Array(新的Float64Array([x])。buffer有一些(布尔))
非常好的用例。有一件小事情我还不知道:您提供的表达式还声明,
-0>0
将导致
true
。当我读到它时,我震惊了,当然,我立即在浏览器的开发工具中尝试了它。它似乎返回了
false
(正如我预期的那样).我可能误解了什么吗?我真的不记得写过这篇文章,我知道你的观察是正确的。请原谅我的愚蠢,我将添加一条评论来说明这一点。
function isNegativeZero(n) {
    n = Number( n );
    return (n === 0) && (1 / n === -Infinity);
}
if(1/zero===Infinity) {
  // zero is +0
} else {
  // zero is -0
}
Math.sign( 1 / +0 )
Math.sign( 1 / -0 )

Math.sign( 1 / x )