关于javascript:为什么parseInt(1/0,19)返回18?

Why does parseInt(1/0, 19) return 18?

我在javascript中遇到了一个恼人的问题。

1
2
> parseInt(1 / 0, 19)
> 18

为什么parseInt返回18


1/0的结果是Infinity

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

以下是以19为基数的数字及其十进制值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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/0Infinity的评价
  • parseInt读到Infinity,高兴地注意到I以19为基数是18。
  • parseInt忽略字符串的其余部分,因为它无法转换。

请注意,对于任何基>= 19,您都会得到一个结果,但对于低于该值的基则不会。对于基础>= 24,您将得到更大的结果,因为n在该点成为一个有效数字。


要添加到以上答案中:

parseint用于将字符串解析为数字(线索在名称中)。在您的情况下,您根本不想进行任何解析,因为1/0已经是一个数字,所以它是一个奇怪的函数选择。如果你有一个数字(你有),并且想把它转换成一个特定的基数,你应该用带基数的toString代替。

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

添加到以上答案中

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

1
2
3
4
5
  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