为什么javascript在toString方法中用0替换数字?

时间:2013-08-26 20:50:09

标签: javascript

在节点v0.8.15和firebug中试过这个:

(123123123123123123123).toString(10)

结果: '123123123123123130000'

任何人都知道发生了什么事?

2 个答案:

答案 0 :(得分:2)

JavaScript将数字存储为64位浮点IEEE 754值,因此最大精度为2 ^ 53(9007199254740992)。除此之外的任何事情,最低有效数字都设置为0。

例如:

(9007199254740992).toString()    // 9007199254740992
(90071992547409925).toString()   // 90071992547409920
(900719925474099255).toString()  // 900719925474099200
// etc

如果你确实需要那么多精度数字,你应该查看一个像bignum这样的库(作者帮助列出了其他这样的库)。

答案 1 :(得分:2)

javascript中的所有数字(与许多其他语言不同)存储为(AFAIK 64位)浮点数(从不整数)。

如果你不熟悉它是如何工作的,那就像科学记法(AKA标准形式):a * 10 b

当您键入123123123123123123123时,它太大而无法放入浮动的a部分。 a的值将存储为1.2312312312312313,截断最低值的溢出数字,b设置为20,以提供尽可能好的原始近似值值。当你得到字符串值时,计算出1.2312312312312313 * 10 20 ,给出123123123123123130000。