簡體   English   中英

使用Math.round后在JavaScript中使用-0? 什么是-0?

[英]-0 in JavaScript after using Math.round? What is -0?

我只想生成范圍<-1,1>隨機整數,即-1,0或1.我認為這段代碼指出:

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

但是除了-1,0和1之外我還有一個價值。我不確定那應該是什么:

圖片描述

現在我不認為這是實現錯誤,但如果是,我正在使用Firefox 41,同樣的事情發生在Google Chrome 39.當我嘗試在控制台中記錄-0 ,它顯示為-0-0轉換為String顯示為"0" 它是什么? 我可以將它用於某些東西,比如一些很酷的編程黑客和解決方法嗎? 如果我不忽略它會導致一些錯誤嗎?

兩個零

因為JavaScript的數字保持大小和符號分開,所以每個非負數都有一個負數,包括0.這個的基本原理是每當你用數字表示數字時,它就會變得很小,以至於它與0無法區分,因為編碼不精確足以代表差異。 然后有符號的零允許您記錄“從哪個方向”接近零; 也就是說,數字在被認為是零之前的標志是什么。

這里開始


如果您有興趣,請提供更多技術資料

IEEE作為IEEE 754標准的一部分於1985年引入-0和+0的實現。 該標准解決在各種浮點實現中發現的許多問題 ,這些問題使得它們難以可靠且可移植地使用。

標准定義

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

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 31和2 31 -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

Math.round函數按照標准的規定工作

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM