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」' –