ceb*_*bor 849 javascript parseint
我在JavaScript中遇到了烦人的问题.
> parseInt(1 / 0, 19)
> 18
Run Code Online (Sandbox Code Playgroud)
为什么要parseInt
回来18
?
Jon*_*Jon 1288
结果1/0
是Infinity
.
parseInt
将其第一个参数视为字符串,这意味着首先Infinity.toString()
调用它,生成字符串"Infinity"
.因此它的工作原理与您要求它将"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
Run Code Online (Sandbox Code Playgroud)
接下来发生的是parseInt
扫描输入"Infinity"
以找到它的哪个部分可以被解析并在接受第一个之后停止I
(因为n
它不是基数19中的有效数字).
因此它的行为就像你调用了一样parseInt("I", 19)
,它被上面的表转换为十进制18.
Cra*_*tro 224
这是事件的顺序:
1/0
评估为 Infinity
parseInt
阅读Infinity
并愉快地记下I
基数19中的18parseInt
忽略字符串的其余部分,因为它无法转换.请注意,您将获得任何基础的结果>= 19
,但不会获得低于该基数的基数.对于基数>= 24
,您将获得更大的结果,因为n
在该点变为有效数字.
kyb*_*kos 37
要添加上述答案:
parseInt旨在将字符串解析为数字(线索在名称中).在你的情况下,你根本不想做任何解析,因为1/0 已经是一个数字,所以这是一个奇怪的功能选择.如果您有一个数字(您这样做)并希望将其转换为特定基数,则应使用带有基数的toString.
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
Run Code Online (Sandbox Code Playgroud)
Imd*_*dad 13
添加到上面的答案
parseInt(1/0,19)
相当于 parseInt("Infinity",19)
基数为19的数字0-9
, A-I
(or a-i)
是有效数字.因此,从"无限"取出I
基数19并转换为基数10变为18然后它尝试获取下一个字符,即n
基数19中不存在的字符,因此丢弃下一个字符(根据javascript将字符串转换为数字的行为) )
所以,如果你写parseInt("Infinity",19)
OR parseInt("I",19)
或者parseInt("i",19)
结果会是相同的,即18
.
现在,如果你写parseInt("I0",19)
的结果将是342
as 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
即
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
56649 次 |
最近记录: |