ECMAScript有两个零号码:+0
和-0
。
他们大多数比较算法视为相等:
+0 == -0 // true (Equality comparison)
+0 === -0 // true (StrictEquality comparison)
[+0].includes(-0) // true (SameValueZero comparison)
但是,它们是不同的数值:
Object.is(+0, -0) // false (SameValue comparison)
通常情况下,这两个零在数学计算中表现相同。然而,
1/+0 === +Infinity
1/-0 === -Infinity
在这种情况下,你会得到-0
因为Math.round
定义如下:
如果X小于0,但大于或等于-0.5,结果是 -0。
在一般情况下,如果你有-2 和2 -1之间的整数,你想如果是-0
将其转换为+0
,并且不以其他方式改变它,你可以使用按位OR:
-1 | 0 // -1
-0 | 0 // +0
+0 | 0 // +0
+1 | 0 // +1
然而,在你的情况,你可以只取Math.round
的-1
外:
Math.round(Math.random()*2) - 1
但是使用Math.round
的注意将会产生不均匀的概率分布。考虑使用
Math.floor(Math.random()*3) - 1
https://en.wikipedia.org/wiki/Signed_zero – zerkms
相关[是+0和-0相同?(http://stackoverflow.com/q/7223359/218196) –
重要的是要注意'-0 === 0'返回true,所以它不是你必须担心的。如果你想将-0转换为0,只需写'myvar = myvar || 0;'或者对它进行任何操作。 '(-0).toString()'也返回'“0”' –