为什么这是正确的:parseInt(1111111111111111,2)=== parseInt(11111111111111111,2)

8
这个问题只是出于好奇。
通过控制台
parseInt(1111111111111111,2) // 16 1's

返回值

65535

并且

parseInt(11111111111111111,2) // 17 1's

返回值

65535

此外
//          16 1's                           17 1's
if(parseInt(1111111111111111,2) === parseInt(11111111111111111,2))

返回值

true

这里的诀窍在哪里?

谢谢


3
提示:尝试只输入11111111111111111 - SLaks
2
(1111111111111111).toString() === "1111111111111111"(11111111111111111).toString() === "11111111111111112"parseInt 需要一个字符串,而 2 是一个无效的二进制数字。 - Lucas Trzesniewski
1
@zerkms - parseInt 的第一件事是对第一个参数调用 ToString,因此不需要是字符串。 - RobG
1
@RobG确实如此,当数据已经损坏时。无论内部执行什么操作,该接口都需要将其转换为字符串。 - zerkms
1
@zerkms - 结果并不是因为您的评论所示将数字传递给 parseInt,而是因为 IEEE 754 算术。 - RobG
显示剩余7条评论
1个回答

8

11111111111111111是一个十进制数的字面量,它对于Javascript来说太大而无法精确编码。

parseInt(, 2)将在第一个不是10的字符处停止解析,因此一旦精度降低,它就会停止解析。

把它改成字符串就可以了。


你确定吗?我以为JavaScript使用64位整数? - Ryan
1
@self:不是的;它使用64位_floats_。这是一个重要的区别。 - SLaks
3
@william.taylor.09 Java!================= JavaScript - zerkms
@SLaks 我知道浮点数和整数的区别。我只是在澄清。 - Ryan
1
@zerkms 或者一个双精度浮点数 :-) - Lucas Trzesniewski
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接