parseInt()科学计数法

5

在使用JS时,我注意到了这个问题。

为什么parseInt(1e+21)返回1,而parseInt(1e+20)返回100000000000000000000parseInt(10e+20)也返回1?

为什么parseInt(1.7976931348623157E+10308);返回NaN,而parseFloat(1.7976931348623157E+10308)返回Infinity


甚至我还制作了一个斐波那契数列,任何带有+21指数的值都只返回第一个数字:

fibonacci sequence scientific notation

parseFloat()会一直返回正确的数字,直到无穷大。

斐波那契演示(int:parseInt():parseFloat())

(在Chrome中测试)

1个回答

3
parseIntparseFloat应该解析字符串并将其转换为Number类型。因此,当你给它们一个Number时,解释器会将其强制转换为一个字符串。所以,至少在Firefox中,"" + 1e+20输出"100000000000000000000""" + 1e+21输出"1e+21"
让我们阅读parseInt文档

如果parseInt遇到指定基数下不是数字的字符,则忽略它及其后续字符,并返回解析到该点的整数值

因此,parseInt("1.whatever")返回1parseInt("32.231e+something")返回32parseFloat也发生了类似的事情。
这是弱类型的错。我认为,当你做你所做的事情时,正确的行为应该是抛出异常。

为什么parseInt(1e+20)返回的是100000000000000000000而不是1呢? - kemicofa ghost
我已经说过了。当1e+20被强制转换为字符串时,它输出的是"100000000000000000000",然后被解析为正确的数字。而1e+21则输出"1e+21"。尝试一下我在答案中写的"" + <number>求和方法。 - rhaps0dy
我做了。parseInt(""+1e+21) 的输出是 1。 - kemicofa ghost
不,我的意思是运行 "" + 1e+21,不需要使用 parseInt。1e+20同理。 - rhaps0dy

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