2015-10-19 249 views
4

我只是想在範圍<-1,1>產生隨機整數,即-1,0或1。我覺得這碼釘它:-0?什麼是-0?

Math.round(Math.random()*2-1) 

但我發現了一個相隔更多的價值爲-1, 0和1。我不知道那是什麼應該是:

image description

現在,我不認爲這是實現錯誤,但如果是,我使用的是Firefox 41和同樣的事情發生在Google Chrome 39中。當我嘗試在控制檯中登錄-0時,它顯示爲-0-0轉換爲String顯示爲"0"。它是什麼?我可以用它來做些什麼,比如一些很酷的編程黑客和變通辦法嗎?如果我不忽略它,它會導致一些錯誤嗎?

+2

https://en.wikipedia.org/wiki/Signed_zero – zerkms

+2

相關[是+0和-0相同?(http://stackoverflow.com/q/7223359/218196) –

+0

重要的是要注意'-0 === 0'返回true,所以它不是你必須擔心的。如果你想將-0轉換爲0,只需寫'myvar = myvar || 0;'或者對它進行任何操作。 '(-0).toString()'也返回'「0」' –

回答

5

兩個零

因爲JavaScript的數量保持大小和符號分開,每一個非負數有負,包括0 這樣做的原因是,只要你代表了一些數字,它可以變得如此小它與0無法區分,因爲編碼不夠精確,無法表示差異。然後,一個有符號的零可以讓你記錄「從哪個方向」你接近零;也就是說,這個數字在它被認爲是零之前有什麼標誌。

here


更多的技術的東西,如果你有興趣。

-0和+0的實現在1985年由IEEE作爲IEEE 754 standard的一部分引入。在多種浮點實現中發現的標準爲many problems,這使得它們難以可靠和便攜地使用。

該標準定義

  • 算術格式:套二進制和十進制浮點數據,其由有限數量(包括符號的零和次正規數),無窮大的,和特殊的「非數字「值(NaN)
  • 交換格式:可用於以高效和緊湊形式交換浮點數據的編碼(位串)
  • 舍入規則:在算術和轉換期間舍入數字時要滿足的屬性
  • 操作:算術和其他操作上算術格式 異常處理:異常情況的指示(例如,被零除,溢出等)
2

功能Math.round作品如the standard指定:

如果x小於0但大於或等於-0.5,則結果爲-0。

Math.random僅返回0(零)和1(1)之間的數字,因此您將有幾條該規則出現。

3

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