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