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

为什么javascript在toString方法中将数字替换为0?,javascript,Javascript,在节点v0.8.15和firebug中尝试了这一点: (123123).toString(10) 结果: '123130000' 有人知道发生了什么吗?JavaScript将数字存储为64位浮点IEEE 754值,因此最大精度为2^53(9007199254740992)。除此之外的任何内容,最低有效位仅设置为0 例如: (9007199254740992).toString() // 9007199254740992 (90071992547409925).toString() //

在节点v0.8.15和firebug中尝试了这一点:

(123123).toString(10)

结果:
'123130000'


有人知道发生了什么吗?

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

例如:

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

如果您真的需要这么多位精度,您应该查看一个库,例如(作者很有帮助地列出了其他此类库)。

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

例如:

(9007199254740992).toString()    // 9007199254740992
(90071992547409925).toString()   // 90071992547409920
(900719925474099255).toString()  // 900719925474099200
// etc
如果您真的需要这么多位精度,您应该查看一个库,例如(作者很有帮助地列出了其他这样的库)。

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

如果你不熟悉它的工作原理,它就像科学记数法(又称标准形式):a*10b

键入123123时,它太大,无法放入浮动的
a
部分。
a
的值将存储为1.2313,截断溢出数字的最低值,
b
设置为20,以提供尽可能接近原始值的近似值。获取字符串值时,将计算1.2313*1020,得到123130000。

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

如果你不熟悉它的工作原理,它就像科学记数法(又称标准形式):a*10b


键入123123时,它太大,无法放入浮动的
a
部分。
a
的值将存储为1.2313,截断溢出数字的最低值,
b
设置为20,以提供尽可能接近原始值的近似值。当您得到字符串值时,会计算1.2313*1020,得到123130000。

浮点数的精度有限。我猜这与整数溢出有关。快速的谷歌搜索显示
9007199254740992
是javascript中的最大int值,但不会丢失精度。@underbar:Nope。JavaScript中没有整数(除非在按位操作中),因此没有溢出。请注意,更改数字的不是
.toString()
:JS对数字的精度有限,无论您对它们执行什么操作。@Bergi Ahhh感谢您的帮助。我从来没有想过我假设的整数实际上是精确的浮点。浮点数字的精度有限。我猜这与整数溢出有关。快速的谷歌搜索显示
9007199254740992
是javascript中的最大int值,但不会丢失精度。@underbar:Nope。JavaScript中没有整数(除非在按位操作中),因此没有溢出。请注意,更改数字的不是
.toString()
:JS对数字的精度有限,无论您对它们执行什么操作。@Bergi Ahhh感谢您的帮助。我从没想过我假设的整数实际上是精确的浮点。