将一个非常大的数字解析为整数为什么会返回1

5

parseInt(123123123123123123123123);      //return 1
parseInt(123123123123123123123123123);   //return 1
parseInt(123123123123123123123123123123);//return 1

在Chrome中进行测试!

2个回答

6

对于这个问题,仔细阅读 parseInt() 的文档可以提供一个答案。以下是发生的情况:

  1. parseInt 期望它的第一个参数是一个字符串。如果不是,它会将其转换为字符串。实际上,这很有趣,因为它似乎是通过...在引号中包装它并通过 .toString() 传递它来进行转换的,而在这种情况下,这与 parseInt() 函数形成了更多或更少的相反作用。在你的例子中,parseInt(123123123123123123123123); 变成了 parseInt("1.2312312312312312e+29")

  2. 然后它将转换为字符串的值传递给 parseInt()。正如文档所告诉我们的那样,如果它遇到一个非数字字符,它就会中止并使用它目前所拥有的内容... 并截断为整数。因此,它正在获取 "1.2312312312312312e+29",达到 +,中止,解析 "1.2312312312312312",并得出 1。

意外后果!

只有当整数转换为字符串时呈指数形式时,才会出现此问题。根本问题在于,尽管您认为 parseInt()Number.toString() 会相互映射...但它们并不完全相同,因为通过 toString() 传递的 int 值可能会生成 parseInt() 不理解的字符串。


@S McCrohan +1 很好地解释了。 - Sachin Jain

2

首先,为了避免猜测,始终要指定基数(第二个参数)。

其次,parseInt 接受字符串作为输入,因此在你的数字周围添加引号。

parseInt("123123123123123123123123123123", 10)
1.2312312312312312e+29

Mozilla开发者参考文献有关于此函数的良好的文档和示例。关于基数,他们说:

始终指定此参数以消除读者的困惑并保证可预测的行为。当未指定基数时,不同的实现会产生不同的结果。


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