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 )