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