首页 文章

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

提问于
浏览
839

我在JavaScript中遇到了烦人的问题 .

> parseInt(1 / 0, 19)
> 18

为什么 parseInt 返回 18

4 回答

  • 1275

    要添加上述答案:

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

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

    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 .

  • 34

    这是事件的顺序:

    • 1/0 评估为 Infinity

    • parseIntInfinity 并愉快地注意到 I 在基数19中是18

    • parseInt 忽略字符串的其余部分,因为它无法转换 .

    请注意,您将获得任何基础 >= 19 的结果,但不会获得低于该基数的基数 . 对于基数 >= 24 ,您将获得更大的结果,因为 n 在该点变为有效数字 .

  • 11

    添加到上面的答案

    parseInt(1/0,19) 相当于 parseInt("Infinity",19)

    在基数为19的数字中, 0-9A-I (or a-i) 是有效数字 . 因此,从"Infinity"它需要 I 的基数19并转换为基数10,它变为18然后它尝试采用下一个字符,即 n ,这在基数19中不存在,因此丢弃下一个字符(根据javascript将字符串转换为数字的行为) )

    所以,如果你写 parseInt("Infinity",19)parseInt("I",19)parseInt("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

    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
    

相关问题