我遇到一個奇怪的問題,在我的單元測試給我帶來了在JavaScript中意外舍入的結果之一:在JavaScript或IEEE-754中舍入怪癖?
(2.005).toFixed(2)
// produces "2.00"
(2.00501).toFixed(2)
// produces "2.01"
起初我懷疑這是一個唯一的Webkit的問題,但它在壁虎repros這意味着對我來說這是ECMA-262或IEEE-754的預期副作用。我假設2.005的二進制表示會稍微少一些?或者ECMA-262是否規定了toFixed
的循環方法?
任何人都在意對引擎蓋下正在發生的事情有所瞭解,以便讓我安心?
更新:感謝您的意見。
我應該補充一點,讓我有點緊張的事情之一是在Webkit dtoa.cpp
的快速搜索中發現的意見,這似乎暗示有多條路徑可以四捨五入,而且開發人員並不確定它是如何實現的工作,包括相關FIXME
:
https://trac.webkit.org/browser/trunk/Source/WTF/wtf/dtoa.cpp#L1110
而且,並不在於它意味着很多,但IE9輪次如我所料,這意味着它要麼是不是ECMA-262的一部分,或者它們有一個bug。
很可能'2.005'實際上是二進制浮點型的'2.004999999 ...'。 – Mysticial
2.00499999999999989341858963598497211933135986328125 –
也許[看看這裏](http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number-problem)有很多關於這個問題的文章的鏈接,最重要的鏈接是[可能的重複](http://stackoverflow.com/questions/588004/is-javascripts-math-broken) –