为什么parseInt()
和parseFloat()
之间有这种行为差异?
我有一个字符串,其中包含08
。
当我编写以下代码时:
alert(hfrom[0]);
alert(parseInt(hfrom[0]));
alert(parseFloat(hfrom[0]));
以下输出内容是生成的:08
0
8
为什么在这种情况下,parseInt
和 parseFloat
返回两个不同的结果?
为什么parseInt()
和parseFloat()
之间有这种行为差异?
我有一个字符串,其中包含08
。
当我编写以下代码时:
alert(hfrom[0]);
alert(parseInt(hfrom[0]));
alert(parseFloat(hfrom[0]));
以下输出内容是生成的:08
0
8
为什么在这种情况下,parseInt
和 parseFloat
返回两个不同的结果?
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(十进制)。
parseFloat
没有任何关系。我刚刚将其关闭为重复问题,但我不确定是否会影响搜索排名。也许应该编辑一下标题或者其他什么的。 - Paul使用 parseInt()
函数时,应该始终包括进制参数。例如:parseInt('013', 10)
,否则它可能会将其转换为不同的数字基数。
parseInt('013') === 11
parseInt('013', 10) === 13
parseInt('0x13') === 19
8
:http://jsfiddle.net/nqNvw/ - gideon