在ECMAScript 5.1规范中,+0和-0是有区别的。
为什么+0 === -0的结果为真?
在ECMAScript 5.1规范中,+0和-0是有区别的。
为什么+0 === -0的结果为真?
当前回答
维基百科有一篇很好的文章解释了这一现象:http://en.wikipedia.org/wiki/Signed_zero
简单地说,+0和-0都在IEEE浮点规范中定义。从技术上讲,它们都不同于不带符号的0,后者是整数,但实际上它们的结果都是0,因此在实际应用中,可以忽略这种区别。
其他回答
我将其归咎于严格相等比较方法('===')。 看4d部分
参见7.2.13规范严格相等比较
维基百科有一篇很好的文章解释了这一现象:http://en.wikipedia.org/wiki/Signed_zero
简单地说,+0和-0都在IEEE浮点规范中定义。从技术上讲,它们都不同于不带符号的0,后者是整数,但实际上它们的结果都是0,因此在实际应用中,可以忽略这种区别。
我刚刚遇到了一个例子,其中+0和-0的行为确实非常不同:
Math.atan2(0, 0); //returns 0
Math.atan2(0, -0); //returns Pi
小心:即使在使用数学。对-0.0001这样的负数四舍五入,它实际上会是-0,并且会打乱上面所示的一些后续计算。
快速和肮脏的方法来解决这个问题,像这样做smth:
if (x==0) x=0;
或者是:
x+=0;
这将数字转换为+0,如果它是-0。
在JavaScript中用于表示数字类型的IEEE 754标准中,符号由位表示(1表示负数)。
因此,对于每个可表示的数字,包括0,都存在一个负数和一个正数。
这就是-0和+0同时存在的原因。
我将添加这个作为答案,因为我忽略了@user113716的注释。
你可以这样测试-0:
function isMinusZero(value) {
return 1/value === -Infinity;
}
isMinusZero(0); // false
isMinusZero(-0); // true