parseInt()和parseFloat()之间的行为差异

10

为什么parseInt()parseFloat()之间有这种行为差异?

我有一个字符串,其中包含08

当我编写以下代码时:

alert(hfrom[0]);
alert(parseInt(hfrom[0]));
alert(parseFloat(hfrom[0]));
以下输出内容是生成的:
08
0
8

为什么在这种情况下,parseIntparseFloat 返回两个不同的结果?


1
请查看这篇 Stack Overflow 的帖子:https://dev59.com/zWw05IYBdhLWcg3w_WxN。这是因为 parseInt 假定以 0 开头的数字为八进制数。 - Chandu
在 Chrome 中在 jsFiddle 上运行这两个函数,我得到的结果都是 8:http://jsfiddle.net/nqNvw/ - gideon
2
@gideon,那是因为您传递了已转换为十进制整数的数字。如果传递字符串,它的行为会有所不同。请参阅:http://jsfiddle.net/nqNvw/1/(这绝对是一种奇怪的JavaScript现象)。 - Ben Lee
2个回答

10

parseInt() 函数根据字符串中的第一个字符来确定数字的进制。如果以 0x 开头,那么就是十六进制(基数为 16)。否则,如果以 0 开头,那么就是八进制(基数为 8)。如果既不以 0x 开头,也不以 0 开头,那么就是十进制(基数为 10)。

你可以通过传递第二个参数来指定数字的进制:

alert(parseInt(hfrom[0], 10)); // 8

从MDN(上面有链接)得知:

如果radix未定义或为0,则JavaScript会假定以下内容:

如果输入字符串以"0x"或"0X"开头,则基数为16(十六进制)。 如果输入字符串以"0"开头,则基数为8(八进制)。这个特性是非标准的,某些实现有意不支持它(而是使用基数10)。因此,在使用parseInt时总是要指定基数。如果输入字符串以任何其他值开头,则基数为10(十进制)。


请参见该页面上的 示例 部分。 - Paul
不再是这样了吗?他们修复了吗?现在parseInt('010')会打印10。 - Teddy
看起来他们在某种程度上修复了它。https://stackoverflow.com/a/22140772/1364747 - Teddy
1
@Teddy 正确。六年前的这个答案已经不再相关,但是今天问题也不再像当时那样有意义了,因为没有人应该再看到原帖中的行为了。 - Paul
真的。今天我专门在谷歌上搜索了parseInt和parseFloat的区别,这个问题是排名前几的链接之一。 - Teddy
@Teddy 我认为标题的选择不太恰当,因为它与 parseFloat 没有任何关系。我刚刚将其关闭为重复问题,但我不确定是否会影响搜索排名。也许应该编辑一下标题或者其他什么的。 - Paul

2

使用 parseInt() 函数时,应该始终包括进制参数。例如:parseInt('013', 10),否则它可能会将其转换为不同的数字基数。

parseInt('013') === 11
parseInt('013', 10) === 13
parseInt('0x13') === 19

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