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

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

> parseInt(1 / 0, 19)
> 18

Почему функция parseInt возвращает 18?

Ответ 1

Результатом 1/0 является 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), который преобразуется в десятичную строку 18 в таблицу выше.

Ответ 2

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

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

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

Ответ 3

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

parseInt предназначен для анализа строк в числах (ключ в имени). В вашей ситуации вы вообще не хотите выполнять синтаксический анализ, поскольку 1/0 уже является числом, поэтому это странный выбор функции. Если у вас есть номер (который вы делаете) и хотите преобразовать его в определенную базу, вы должны использовать toString с помощью radix.

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

Ответ 4

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

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

то есть.

  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