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

IT技术 javascript parseint
2021-02-25 15:32:58

我在JavaScript 中有一个烦人的问题

> parseInt(1 / 0, 19)
> 18

为什么parseInt函数返回18

4个回答

的结果1/0Infinity

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

接下来发生的是parseInt扫描输入"Infinity"以找到可以解析的部分并在接受第一部分后停止I(因为n不是基数为 19 的有效数字)。

因此,它的行为就像您调用了parseInt("I", 19),根据上表将其转换为十进制 18。

@mithunsatheesh 试试parseInt('Infini',24)
2021-04-23 15:32:58
为什么有人想用这种行为的语言“编程”,这超出了我的理解。
2021-04-25 15:32:58
@mithunsatheesh:因为在基数 24n中也是一个有效数字,所以它实际上最终做了parseInt("Infini", 24).
2021-05-11 15:32:58
@FransBouma:JS 以自己的方式美丽。事实上,这里发生的任何事情在动态语言中都是不合理的。
2021-05-16 15:32:58
@Jon:这个工件不是动态语言的结果;这是松散打字的结果。在严格类型的动态语言中,Infinity(浮点数)到“Infinity”(字符串)的隐式转换不会发生,以防止这种愚蠢的行为。
2021-05-17 15:32:58

这是事件的顺序:

  • 1/0 评估为 Infinity
  • parseInt阅读Infinity并愉快地注意到I以 19 为底的 18
  • parseInt 忽略字符串的其余部分,因为它不能被转换。

请注意,您会得到任何 base 的结果>= 19,但不会得到低于该值的基数。对于 bases >= 24,您将获得更大的结果,因为此时n成为有效数字。

@NordvindparseInt接受的最大基数是 36,因为英文字母表中有 26 个字母,并且约定是先使用数字然后使用字母作为给定基数中的有效数字集。
2021-04-22 15:32:58
@CJBS 正确,但在此之前缺少一个要点:parseInt期望字符串作为其第一个参数,因此Infinity被强制为"Infinity"; 也应该是有序列表,而不是无序列表。但公认的答案已经解释了一切......
2021-04-30 15:32:58
@Thilo 顺便说一句,这是什么原因,如果基数更大,为什么它可能会停在 19?你知道,什么是最伟大的基础 JS 可以解释?
2021-05-12 15:32:58
在第 2 点上,我可以建议更改Infinity"Infinity"...
2021-05-13 15:32:58

要添加到上述答案:

parseInt 旨在将字符串解析为数字(线索在名称中)。在您的情况下,您根本不想进行任何解析,因为 1/0已经是一个数字,因此这是一个奇怪的函数选择。如果您有一个数字(您这样做)并希望将其转换为特定的基数,则应使用带有基数的 toString代替。

var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"

添加到上述答案

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)ORparseInt("i",19)结果将是相同的,即18.

现在,如果你写parseInt("I0",19)的结果将是342I 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

IE

  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