parseInt(8558968890839370929) 返回 8558968890839371000 ,为啥? [复制]

Posted

技术标签:

【中文标题】parseInt(8558968890839370929) 返回 8558968890839371000 ,为啥? [复制]【英文标题】:parseInt(8558968890839370929) return 8558968890839371000 ,why? [duplicate]parseInt(8558968890839370929) 返回 8558968890839371000 ,为什么? [复制] 【发布时间】:2014-06-06 07:59:29 【问题描述】:

当我执行时

parseInt(8558968890839370929)

在 Chrome 中,它返回 8558968890839371000。为什么它不返回9,007,199,254,740,992 (253) 而是返回?

【问题讨论】:

【参考方案1】:

因为跨越了 int 的范围。 int 的最大值可以是+/- 9007199254740992

来自ECMA

注意所有大小为 no 的正整数和负整数 大于 253 可以用 Number 类型表示(实际上, 整数 0 有两种表示形式,+0 和 -0)。

【讨论】:

是的,在 javascript 中,数字的类型在 2^53 时是交叉的,所以我认为它必须返回我 Math.pow(2,53),但这不是结果 @user3559031 我怀疑它最终溢出并回绕到8558968890839371000 我不这么认为。你可以在 chrome 中尝试 parseInt(8558968890839371001) 原来是 8558968890839371000,而 parseInt(8558968890839371002) 原来是 85589680it 890839371000与 parseInt(8558968890839371001) 和 parseInt(8558968890839371002) 的结果不应该相同。似乎这个数字超过了最大值。 @user3559031 - “它是如何运行的”是什么意思?如果您想查看执行您所看到的 JS 代码,您可以查看 webkit 或 Firefox 代码(它们是开源的)。您超出了整数的最大范围,因此您失去了精度。不多说了。我链接到上面的一个 dup 问题并投票决定以 dup 的身份结束。 @user3559031 - 因为它失去了精度。精度限制意味着无法跟踪那么多数字,因此最后一个数字不再准确。如果需要精度,请不要超过 javascript 支持的最大整数。

以上是关于parseInt(8558968890839370929) 返回 8558968890839371000 ,为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

javascript中parseInt函数的用法

parseInt()解析整数与parsetFloat()解析浮点数

parseInt与JSON.stringify用法

javascript 千万别用parseInt转换小数

parseInt神秘的第二个参数

js parseFloat 与 parseInt 处理字符串