Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么parseInt(1/0,19)返回18?_Javascript_Parseint - Fatal编程技术网

Javascript 为什么parseInt(1/0,19)返回18?

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

我在JavaScript中遇到了一个恼人的问题

> 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
    并愉快地注意到
    I
    在基数19中是18
  • 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