Почему 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