我在javascript中遇到了一个烦人的问题。
> parseInt(1 / 0, 19)> 18
为什么parseInt函数返回18?
parseInt
18
1/0的结果是Infinity。
1/0
Infinity
parseInt将其第一个参数视为字符串,这意味着首先调用Infinity.toString(),生成字符串"Infinity"。因此,它的工作原理与您要求它将基数为19的"Infinity"转换为十进制相同。
Infinity.toString()
"Infinity"
以下是以19为基数的数字及其十进制值:
Base 19 Base 10 (decimal)---------------------------0 01 12 23 34 45 56 67 78 89 9a 10b 11c 12d 13e 14f 15g 16h 17i 18
接下来发生的事情是parseInt扫描输入"Infinity"以查找可以解析的部分,并在接受第一个I后停止(因为n在基数19中不是有效数字)。
I
n
因此,它的行为就像您调用parseInt("I", 19)一样,它通过上表转换为十进制18。
parseInt("I", 19)
以下是事件的顺序:
请注意,您会得到任何基数>= 19的结果,但不会得到低于该基数的结果。对于基数>= 24,您将获得更大的结果,因为n在该点成为有效数字。
>= 19
>= 24
为了补充上述答案:
parseInt旨在将字符串解析为数字(线索就在名称中)。在您的情况下,您根本不想进行任何解析,因为1/0是已经一个数字,所以它是一个奇怪的函数选择。如果您有一个数字(您有)并想将其转换为特定的基数,您应该使用toString的基数代替。
var num = 1 / 0;var numInBase19 = num.toString(19); // returns the string "Infinity"
为了补充以上的答案
parseInt(1/0,19)等于parseInt("Infinity",19)
parseInt(1/0,19)
parseInt("Infinity",19)
在以19为基数的数字中,0-9和A-I(or a-i)是有效的数字。因此,从“无穷大”开始,它取19为基数的I并转换为基数10,变为18然后它尝试获取下一个字符,即n,它不存在于基数19中,因此丢弃下一个字符(根据javascript将字符串转换为数字的行为)
0-9
A-I
(or a-i)
所以,如果你写parseInt("Infinity",19)或parseInt("I",19)或parseInt("i",19),结果将是相同的,即18。
parseInt("I",19)
parseInt("i",19)
现在,如果你写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("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
类似地,parseInt("I11",19)将导致6518
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