为什么parseInt(1/0,19)返回18?
我有一个恼人的JavaScript问题。
> parseInt(1 / 0, 19) > 18
为什么parseInt
返回18
?
1/0
的结果是Infinity
。
parseInt
将其第一个参数视为一个string,这意味着首先调用Infinity.toString()
,产生string"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
扫描input"Infinity"
,find哪个部分可以被parsing,并在接受第一个I
(因为n
不是基数19中的有效数字)后停止。
因此,它的行为就像调用parseInt("I", 19)
,它可以通过上面的表格转换成十进制数字18。
以下是事件的顺序:
-
1/0
评估为Infinity
-
parseInt
读取Infinity
并高兴地注意到,I
在基数19是18 -
parseInt
忽略了string的其余部分,因为它不能被转换。
请注意,你会得到任何基地>= 19
,但不是以下的基地。 对于>= 24
碱基,你会得到一个更大的结果,因为n
成为这个点上的有效数字。
要添加到上面的答案:
parseInt旨在将stringparsing为数字(线索在名称中)。 在你的情况下,你根本不想做任何parsing,因为1/0 已经是一个数字,所以这是一个奇怪的functionselect。 如果你有一个数字(你这样做)并且想把它转换成一个特定的基础,你应该用一个基数来代替toString 。
var num = 1 / 0; var numInBase19 = num.toString(19); // returns the string "Infinity"
添加到上面的答案
parseInt(1/0,19)
相当于parseInt("Infinity",19)
在19位数字中, 0-9
和AI
(or ai)
是有效的数字。 所以,从“无穷大”中, I
需要基数为19,并转换为基数10,它变成18然后它尝试采取下一个字符,即基数19中不存在的n
,所以丢弃下一个字符(根据javascript的转换string的行为号码)
所以,如果你写parseInt("Infinity",19)
或parseInt("I",19)
或parseInt("i",19)
,结果将是相同的,即18
。
现在,如果你写了parseInt("I0",19)
那么结果将是342
IX 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