ChatGPT解决这个技术问题 Extra ChatGPT

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

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

> parseInt(1 / 0, 19)
> 18

为什么 parseInt 函数返回 18

有趣的。但为什么这对你来说是个烦人的问题?您是否必须以其他方式处理 Infinity?如果是这样,if 可能会有所帮助。
你到底在做什么,要求你使用以 19 为底的数字或除以零!?
当您对 JS 感到困惑时,只需返回 this quote 并记住整个该死的语言是在不到 10 天的时间内设计和实现的(根据设计者的说法)。
来自常见问题解答:“您应该只根据您面临的实际问题提出实际的、可回答的问题。”这实际上并不是您实际面临的“烦人问题”,而是一个不切实际的例子that's been floating around the internet forever
python 做同样的事情: int('I', 19) == 18

Z
Zsolt Meszaros

1/0 的结果是 Infinity

parseInt 将其第一个参数视为字符串,这意味着首先调用 Infinity.toString(),生成字符串 "Infinity"。所以它的工作原理与您要求它将以 19 为底的 "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 的有效数字)。

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


@mithunsatheesh 试试 parseInt('Infini',24)
@mithunsatheesh:因为在基数 24 中 n 也是一个有效数字,所以它实际上最终会执行 parseInt("Infini", 24)
为什么有人想用这种行为的语言“编程”,这超出了我的理解。
@FransBouma:JS 有它自己的美。真的,这里发生的任何事情在动态语言中都是不合理的。
@Jon:这个工件不是动态语言的结果;这是松散类型的结果。在严格类型的动态语言中,不会发生 Infinity (float) 到 "Infinity" (string) 的隐式转换,以防止这种愚蠢。
C
Craig Citro

以下是事件的顺序:

1/0 计算为无穷大

parseInt 读取 Infinity 并高兴地注意到我是 18 在基数 19

parseInt 忽略字符串的其余部分,因为它不能被转换。

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


@Thilo BTW,这是什么原因,如果基数更大,为什么它可能会停在 19 点?你知道吗,什么是 JS 可以解释的最伟大的基础?
@Nordvind parseInt 将接受的最大基数是 36,因为英文字母表中有 26 个字母,并且约定是使用数字然后字母作为给定基数中的有效数字集。
关于要点 #2,我可以建议将 Infinity 更改为 "Infinity"...
@CJBS 正确,但在此之前缺少一个要点: parseInt 需要一个字符串作为其第一个参数,因此 Infinity 被强制为 "Infinity";这也应该是一个有序列表,而不是无序列表。但是接受的答案已经解释了一切……
k
kybernetikos

要添加到上述答案:

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

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

I
Imdad

添加到上述答案

parseInt(1/0,19) 等同于 parseInt("Infinity",19)

基数为 19 的数字 0-9A-I (or a-i) 是有效数字。因此,从“Infinity”开始,它需要以 19 为底的 I 并转换为以 10 为底的 18,然后它会尝试获取下一个字符,即 n,它在 19 进制中不存在,因此丢弃下一个字符(根据 javascript 的将字符串转换为数字的行为)

因此,如果您编写 parseInt("Infinity",19) OR parseInt("I",19) OR 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

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