我在JavaScript中遇到了一个烦人的问题。
> parseInt(1 / 0, 19)
> 18
为什么parseInt函数返回18?
我在JavaScript中遇到了一个烦人的问题。
> parseInt(1 / 0, 19)
> 18
为什么parseInt函数返回18?
当前回答
添加到以上答案
parseInt(1/0.19)等同于parseInt(“Infinity”,19)
以19为基数的数字0-9和A-I(或A-I)是有效数字。所以,从“无限”开始,它取了基数19的I,然后转换为基数10,变成了18然后,它尝试获取下一个字符,即n,它不存在于基19中,因此丢弃下一个字符串(根据javascript将字符串转换为数字的行为)
因此,如果你写parseInt(“无限”,19)或parseInt(“I”,19”或parseInt(“I”,19,19),结果将是相同的,即18。
现在,如果你写parseInt(“I0”,19),结果将是342作为I X 19(基数)^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
其他回答
添加到以上答案
parseInt(1/0.19)等同于parseInt(“Infinity”,19)
以19为基数的数字0-9和A-I(或A-I)是有效数字。所以,从“无限”开始,它取了基数19的I,然后转换为基数10,变成了18然后,它尝试获取下一个字符,即n,它不存在于基19中,因此丢弃下一个字符串(根据javascript将字符串转换为数字的行为)
因此,如果你写parseInt(“无限”,19)或parseInt(“I”,19”或parseInt(“I”,19,19),结果将是相同的,即18。
现在,如果你写parseInt(“I0”,19),结果将是342作为I X 19(基数)^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
1/0的结果是无穷大。
parseInt将其第一个参数视为字符串,这意味着首先调用Infinity.toString(),生成字符串“Infinity”。因此,它的工作原理与您要求它将以19为基数的“无限”转换为十进制一样。
以下是以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/0计算为无限parseInt读取Infinity,并高兴地注意到我以19为基数18parseInt忽略字符串的剩余部分,因为它无法转换。
注意,对于任何大于等于19的基数,都会得到一个结果,但对于低于19的基数则不会。对于基数>=24,您将得到一个更大的结果,因为n在该点成为有效数字。
要添加上述答案:
parseInt旨在将字符串解析为数字(线索在名称中)。在您的情况下,您根本不想进行任何解析,因为1/0已经是一个数字,所以这是一个奇怪的函数选择。如果您有一个数字(您这样做了),并希望将其转换为一个特定的基数,则应该使用带有基数的toString。
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"