在測試時,我注意到一些奇怪的東西Math.round()
。爲什麼舍入-0.1回-0
當我被四捨五入接近0
(-0.1
,-0.01
等)正數,在我的控制檯返回值將-0
而非0
。更奇怪的是,如果我要將相同的值設置爲元素的文本,則該元素將顯示0
,而不是-0
。
DEMO: http://jsfiddle.net/dirtyd77/qcug9/
任何人都可以解釋爲什麼出現這種情況?任何幫助將不勝感激!
此外,我正在使用Chrome版本33.0.1750.117。
在測試時,我注意到一些奇怪的東西Math.round()
。爲什麼舍入-0.1回-0
當我被四捨五入接近0
(-0.1
,-0.01
等)正數,在我的控制檯返回值將-0
而非0
。更奇怪的是,如果我要將相同的值設置爲元素的文本,則該元素將顯示0
,而不是-0
。
DEMO: http://jsfiddle.net/dirtyd77/qcug9/
任何人都可以解釋爲什麼出現這種情況?任何幫助將不勝感激!
此外,我正在使用Chrome版本33.0.1750.117。
JavaScript使用的數字類型(IEEE-754雙精度浮點數)具有「正」和「負」零的概念。
-0.1
的下一個最高整數是-0
。在這種情況下,「最高」意味着「走向正無窮」。
從the specification, §15.8.2.15 "Math.round":
如果
x
小於0
但大於或等於-0.5
,結果是−0
。
-0
和+0
均爲渲染如剛纔0
當轉換爲字符串。例如:
console.log(-0) // 0 or -0 depending on what console you use
console.log(String(-0)) // 0 (always)
謝謝你的回答,TJ!我在您提供的文章中發現了一些非常有趣的內容。 '請注意,有一個正零和一個負零。爲了簡潔起見,這些值也分別用符號+0和-0來說明。 (請注意,這兩個不同的零數值由程序表達式+0(或者簡單地0)和-0產生)。' – Dom
JavaScript使用IEEE-754 to represent numbers和規範認爲0
和-0
在技術上是不同的。據推測,負零是與這些值最接近的整數,如Math.round(x)
所定義。
請注意零點既鬆散又嚴格等於負零(0==-0
和0===-0
)。
如果您不想看到-0
,則可以通過執行Math.abs(Math.round(x))
來解決方法。
IEEE雙精度格式允許負零(與正0不同)。這些值被認爲幾乎相等(例如,即使與===
比較並且-0
不被認爲是「小於」0
),但是例如1/0
是infinity
,而1/-0
是-infinity
。
國際海事組織你不應該試圖讀入這個語義太多。
感謝您花時間回答!我也注意到'0 === -0',我一定會接受你的建議,因爲沒有太多的閱讀。 :-D – Dom
'-0 == 0 0'的計算結果爲true – 0xcaff
實際的問題是「什麼是-0以及它爲什麼與0不同?」 – Gareth
這是一個Javascript的怪癖。閱讀http://www.2ality.com/2013/04/quirk-undefined。html獲取更多信息。還搜索:Javascript的怪癖一些其他的樂趣。 –