Почему parseInt (1/0, 19) возвращает 18?

у меня есть раздражающая проблема в JavaScript.

> parseInt(1 / 0, 19)
> 18

почему parseInt return 18?

4 ответов


результат 1/0 is Infinity.

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), который преобразуется в decimal 18 по таблице выше.


вот последовательность событий:

  • 1/0 оценивает в Infinity
  • parseInt читает Infinity и радостно отмечает, что I в 18 в основание 19
  • parseInt игнорирует оставшуюся часть строки, так как она не может быть преобразована.

обратите внимание, что вы получите результат для любой базы >= 19, но не для баз, расположенных ниже. Для баз >= 24, вы получите больший результат, как n становится действительной цифрой при этом точка.


добавить к приведенным выше ответам:

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) или parseInt("I",19) или parseInt("i",19) результат будет таким же i.e 18.

теперь, если вы пишите parseInt("I0",19) результат будет 342 as 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

то есть

  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