在節點v0.8.15和螢火蟲試過這樣:爲什麼javascript在toString方法中用0代替數字?
(123123123123123123123).toString(10)
結果: '123123123123123130000'
任何人都知道這是怎麼回事?
在節點v0.8.15和螢火蟲試過這樣:爲什麼javascript在toString方法中用0代替數字?
(123123123123123123123).toString(10)
結果: '123123123123123130000'
任何人都知道這是怎麼回事?
JavaScript將數字存儲爲64位浮點IEEE 754值,因此最大精度爲2^53(9007199254740992)。任何超出,而最低顯著數字只是設置爲0
例如:
(9007199254740992).toString() // 9007199254740992
(90071992547409925).toString() // 90071992547409920
(900719925474099255).toString() // 900719925474099200
// etc
如果你真的需要的精度許多數字,你應該尋找到一個庫,如bignum(作者有用地列出了其他這樣的庫)。
javascript中的所有數字(與許多其他語言不同)存儲爲(AFAIK 64位)浮點數(從不是整數)。
如果你不熟悉如何工作的,這就像科學記數法(AKA標準形式):A * 10 b
當你鍵入123123123123123123123,實在是太大了,以適應a
部分浮動。 a
的值將被存儲爲1.2312312312312313,截斷最低值的溢出數字,並且b
被設置爲20以提供儘可能好的原始值的近似值。當你得到字符串值時,計算出1.12312312312312313 * 10 ,給出123123123123123130000.
浮點數的精度有限。 –
我猜它是用整數溢出來做的。快速谷歌搜索顯示'9007199254740992'是javascript中的最大int值,不會降低精度。 – underbar
@underbar:沒有。 JavaScript中沒有整數(除非按位操作),因此沒有溢出。 – Bergi