我在JavaScript中遇到了烦人的问题 .
> parseInt(1 / 0, 19) > 18
为什么 parseInt 返回 18 ?
parseInt
18
要添加上述答案:
parseInt旨在将字符串解析为数字(线索在名称中) . 在你的情况下,你根本不想进行任何解析,因为1/0已经是一个数字,所以它是一个奇怪的函数选择 . 如果您有一个号码(您这样做)并希望将其转换为特定的号码,则应使用toString with a radix代替 .
var num = 1 / 0; var numInBase19 = num.toString(19); // returns the string "Infinity"
1/0 的结果是Infinity .
1/0
parseInt将其第一个参数视为字符串,这意味着首先调用 Infinity.toString() ,生成字符串 "Infinity" . 因此它的工作原理与您要求它将基数19中的 "Infinity" 转换为十进制相同 .
Infinity.toString()
"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中的有效数字) .
I
n
因此,它的行为就像你调用了 parseInt("I", 19) ,它被上面的表转换为十进制18 .
parseInt("I", 19)
这是事件的顺序:
1/0 评估为 Infinity
Infinity
parseInt 读 Infinity 并愉快地注意到 I 在基数19中是18
parseInt 忽略字符串的其余部分,因为它无法转换 .
请注意,您将获得任何基础 >= 19 的结果,但不会获得低于该基数的基数 . 对于基数 >= 24 ,您将获得更大的结果,因为 n 在该点变为有效数字 .
>= 19
>= 24
添加到上面的答案
parseInt(1/0,19) 相当于 parseInt("Infinity",19)
parseInt(1/0,19)
parseInt("Infinity",19)
在基数为19的数字中, 0-9 和 A-I (or a-i) 是有效数字 . 因此,从"Infinity"它需要 I 的基数19并转换为基数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
4 回答
要添加上述答案:
parseInt旨在将字符串解析为数字(线索在名称中) . 在你的情况下,你根本不想进行任何解析,因为1/0已经是一个数字,所以它是一个奇怪的函数选择 . 如果您有一个号码(您这样做)并希望将其转换为特定的号码,则应使用toString with a radix代替 .
1/0
的结果是Infinity .parseInt将其第一个参数视为字符串,这意味着首先调用
Infinity.toString()
,生成字符串"Infinity"
. 因此它的工作原理与您要求它将基数19中的"Infinity"
转换为十进制相同 .以下是基数19中的数字及其小数值:
接下来会发生的是
parseInt
扫描输入"Infinity"
以找到它的哪个部分可以被解析并在接受第一个I
后停止(因为n
不是基数19中的有效数字) .因此,它的行为就像你调用了
parseInt("I", 19)
,它被上面的表转换为十进制18 .这是事件的顺序:
1/0
评估为Infinity
parseInt
读Infinity
并愉快地注意到I
在基数19中是18parseInt
忽略字符串的其余部分,因为它无法转换 .请注意,您将获得任何基础
>= 19
的结果,但不会获得低于该基数的基数 . 对于基数>= 24
,您将获得更大的结果,因为n
在该点变为有效数字 .添加到上面的答案
parseInt(1/0,19)
相当于parseInt("Infinity",19)
在基数为19的数字中,
0-9
和A-I
(or a-i)
是有效数字 . 因此,从"Infinity"它需要I
的基数19并转换为基数10,它变为18然后它尝试采用下一个字符,即n
,这在基数19中不存在,因此丢弃下一个字符(根据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
即