为什么parseInt(1 / 0,19)返回18?

时间:2012-07-05 08:37:53

标签: javascript parseint

我在JavaScript中遇到了烦人的问题。

> parseInt(1 / 0, 19)
> 18

为什么parseInt函数返回18

4 个答案:

答案 0 :(得分:1283)

1/0的结果是Infinity

parseInt将其第一个参数视为字符串,这意味着首先调用Infinity.toString(),生成字符串"Infinity"。因此它的工作方式与您要求它将基数19中的"Infinity"转换为十进制相同。

以下是基数19中的数字及其小数值:

Base 19   Base 10 (decimal)
---------------------------
   0            0
   1            1
   2            2
   3            3
   4            4
   5            5
   6            6
   7            7
   8            8
   9            9
   a            10
   b            11
   c            12
   d            13
   e            14
   f            15
   g            16
   h            17
   i            18

接下来发生的事情是parseInt扫描输入"Infinity"以查找可以解析的部分,并在接受第一个I后停止(因为n不是基数19)中的有效数字。

因此,它的行为就像你调用parseInt("I", 19)一样,它在上表中转换为十进制18。

答案 1 :(得分:224)

以下是事件的顺序:

  • 1/0评估为Infinity
  • parseInt读取Infinity,并高兴地注意到I在基数为19时为18
  • parseInt忽略字符串的其余部分,因为它无法转换。

请注意,您会获得任何基础>= 19的结果,但不会获得低于此基数的基数。对于基数>= 24,您会得到更大的结果,因为n在此时成为有效数字。

答案 2 :(得分:37)

要添加上述答案:

parseInt旨在将字符串解析为数字(名称中的线索)。在你的情况下,你根本不想进行任何解析,因为1/0 已经一个数字,所以这是一个奇怪的功能选择。如果您有一个号码(您这样做)并希望将其转换为特定的号码,则应使用toString with a radix代替。

var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"

答案 3 :(得分:13)

添加上述答案

parseInt(1/0,19)相当于parseInt("Infinity",19)

在19个基数中,0-9A-I (or a-i)是有效数字。因此,从“无限”开始,它需要基数19的I并转换为基数10,它变为18 然后它尝试获取下一个字符,即基数19中不存在的n,因此丢弃下一个字符(根据javascript将字符串转换为数字的行为)

所以,如果你写parseInt("Infinity",19)parseInt("I",19)parseInt("i",19),结果将是相同的,18

现在,如果你写parseInt("I0",19),结果将是342 I X 19 (the base)^1 + 0 X 19^0 = 18 X 19^1 + 0 X 19^0 = 18 X 19 + 0 X 1 = 342

同样,parseInt("I11",19)会产生6518

即。

  18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 361   +   1 X 19     +  1 X 1
= 6498  +  19  +  1
= 6518