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

时间:2015-04-21 02:30:45

标签: javascript



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




用铬测试!

2 个答案:

答案 0 :(得分:6)

parseInt()文档的一点创意阅读为此提供了答案。以下是发生的事情:

  1. parseInt期望它的第一个参数是一个字符串。如果不是,则将其转换为字符串。这实际上很有趣,因为它似乎通过...将它包装在引号中并将其传递给.toString(),这在这种情况下或多或少与parseInt()相反。在您的示例中,parseInt(123123123123123123123123);变为parseInt("1.2312312312312312e+29")

  2. 然后它将转换为字符串值并将其传递给parseInt()。正如文档告诉我们的那样,如果它遇到一个非数字字符,它就会中止并继续它到目前为止所做的...并且它会截断为一个整数。所以它采取" 1.2312312312312312e + 29",达到+,中止,解析" 1.2312312312312312"相反,并提出1。

  3. 意想不到的后果!

    你只会看到这个问题的内容足够大,当转换为字符串时,它们会以指数表示法呈现。根本问题在于,即使您认为parseInt()Number.toString()会互相反映......他们也不会,因为int值通过toString()可以生成parseInt()无法理解的字符串。

答案 1 :(得分:2)

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

其次,parseInt需要一个字符串,因此请在数字周围添加引号。

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

Mozilla开发人员参考有good documentation of this function和示例。关于基数,他们说:

  

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