2014-03-03 31 views
3

在測試時,我注意到一些奇怪的東西Math.round()爲什麼舍入-0.1回-0

當我被四捨五入接近0-0.1-0.01等)正數,在我的控制檯返回值將-0而非0。更奇怪的是,如果我要將相同的值設置爲元素的文本,則該元素將顯示0,而不是-0

DEMO: http://jsfiddle.net/dirtyd77/qcug9/

enter image description here

任何人都可以解釋爲什麼出現這種情況?任何幫助將不勝感激!

此外,我正在使用Chrome版本33.0.1750.117

+0

'-0 == 0 0'的計算結果爲true – 0xcaff

+1

實際的問題是「什麼是-0以及它爲什麼與0不同?」 – Gareth

+0

這是一個Javascript的怪癖。閱讀http://www.2ality.com/2013/04/quirk-undefined。html獲取更多信息。還搜索:Javascript的怪癖一些其他的樂趣。 –

回答

3

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) 
+0

謝謝你的回答,TJ!我在您提供的文章中發現了一些非常有趣的內容。 '請注意,有一個正零和一個負零。爲了簡潔起見,這些值也分別用符號+0和-0來說明。 (請注意,這兩個不同的零數值由程序表達式+0(或者簡單地0)和-0產生)。' – Dom

1

JavaScript使用IEEE-754 to represent numbers和規範認爲0-0在技術上是不同的。據推測,負零是與這些值最接近的整數,如Math.round(x)所定義。

請注意零點既鬆散又嚴格等於負零(0==-00===-0)。

如果您不想看到-0,則可以通過執行Math.abs(Math.round(x))來解決方法。

+0

爲什麼downvote? – maerics

+0

我不確定你爲什麼被低估,我認爲你的回答是提供信息!再次感謝您花時間回答! – Dom

1

IEEE雙精度格式允許負零(與正0不同)。這些值被認爲幾乎相等(例如,即使與===比較並且-0不被認爲是「小於」0),但是例如1/0infinity,而1/-0-infinity

國際海事組織你不應該試圖讀入這個語義太多。

+0

感謝您花時間回答!我也注意到'0 === -0',我一定會接受你的建議,因爲沒有太多的閱讀。 :-D – Dom