Javascript 为什么parseInt(1/0,19)返回18?
我在JavaScript中遇到了一个恼人的问题Javascript 为什么parseInt(1/0,19)返回18?,javascript,parseint,Javascript,Parseint,我在JavaScript中遇到了一个恼人的问题 > parseInt(1 / 0, 19) > 18 为什么parseInt函数返回18 将其第一个参数视为字符串,这首先意味着无限。调用toString(),生成字符串“无限”。因此,它的工作原理与您要求它将以19为基数的“无穷大”转换为十进制时的工作原理相同 以下是以19为基数的数字及其十进制值: base19以10为底(十进制) --------------------------- 0 0 1
> parseInt(1 / 0, 19)
> 18
为什么
parseInt
函数返回18
将其第一个参数视为字符串,这首先意味着无限。调用toString()
,生成字符串“无限”
。因此,它的工作原理与您要求它将以19为基数的“无穷大”
转换为十进制时的工作原理相同
以下是以19为基数的数字及其十进制值:
base19以10为底(十进制)
---------------------------
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
E14
F15
g 16
H17
i 18
接下来发生的事情是,parseInt
扫描输入的“无穷大”
,找到可以解析的部分,并在接受第一个I
后停止(因为n
不是基19中的有效数字)
因此,它的行为就像您调用了
parseInt(“I”,19)
,它通过上表转换为十进制18。以下是事件序列:
计算结果为1/0
无穷大
读取parseInt
并愉快地注意到Infinity
在基数19中是18I
忽略字符串的其余部分,因为它无法转换parseInt
请注意,对于任何基数
>=19
,您都会得到结果,但对于低于该基数的基数,则不会得到结果。对于基数=24
,您将得到更大的结果,因为n
在该点成为有效数字。要添加到上述答案中:
parseInt用于将字符串解析为数字(线索在名称中)。在您的情况下,您根本不想进行任何解析,因为1/0已经是一个数字,所以这是一个奇怪的函数选择。如果您有一个数字(确实有),并希望将其转换为特定的基数,则应使用
补充上述答案
parseInt(1/0,19)
相当于parseInt(“无穷大”,19)
在基数19中,数字0-9
和A-I
(或A-I)
是有效的数字。因此,从“无穷大”取基数19的I
,然后转换为基数10,变成18
然后,它尝试获取下一个字符,即n
,该字符不在base 19中,因此丢弃下一个字符(根据javascript将字符串转换为数字的行为)
因此,如果您编写parseInt(“无穷大”,19)
或parseInt(“I”,19)
或parseInt(“I”,19)
,结果将是相同的,即18
现在,如果您编写parseInt(“I0”,19)
结果将是342
作为ix19(基础)^1+0x19^0
=18x19^1+0x19^0
=18x19+0x1
=342
类似地,parseInt(“I11”,19)
将导致6518
i、 e
有趣。但为什么这对你来说是个恼人的问题?你必须用其他方法处理无穷大吗?如果是这样的话,
If
可能会有帮助。你到底在做什么,要求你要么用基数19,要么用零除法!?当你对JS感到困惑时,请回顾并记住,整个该死的语言是在不到10天的时间内设计和实现的(根据编写者的说法)。在常见问题解答中:“你应该只根据你所面临的实际问题提出实际的、可回答的问题。”这实际上不是一个“恼人的问题”实际上,这是一个不现实的例子。python也做同样的事情:int('I',19)=18@mithunsatheesh尝试parseInt('Infini',24)
@mithunsatheesh:因为在base 24中n
也是一个有效数字,所以它实际上会执行parseInt('Infini',24)
。我无法理解为什么有人想用这样的语言来“编程”。@FransBouma:JS有它自己的方式。事实上,在动态语言中,这里发生的事情没有一部分是不合理的。@Jon:这个工件不是动态语言的结果;这是打字不严谨的结果。在严格类型化的动态语言中,为了防止这种愚蠢行为,不会发生无穷大(float)到“无穷大”(string)的隐式转换。@Thilo顺便问一下,如果base大于19,原因是什么,为什么它会停止在19?你知道吗,JS能给出的最大基数是多少?@Nordvind将接受的最大基数是36,因为英语字母表中有26个字母,惯例是先用数字,然后用字母作为给定基数中的有效数字集。关于要点2,我是否可以建议将无穷
改为“Infinity”
…@CJBS是正确的,但在此之前缺少一个要点:parseInt
需要一个字符串作为其第一个参数,因此Infinity
被强制为“Infinity”
;而且这应该是一个有序列表,而不是无序列表。但公认的答案已经解释了一切…
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
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