У меня есть раздражающая проблема в JavaScript .
> parseInt(1 / 0, 19)
> 18
Почему parseInt
функция возвращает 18
?
javascript
parseint
cebor
источник
источник
if
может помочь.Ответы:
Результатом
1/0
являетсяInfinity
.parseInt
обрабатывает свой первый аргумент как строку, что означает, что в первую очередьInfinity.toString()
вызывается, создавая строку"Infinity"
. Так что он работает так же, как если бы вы попросили его преобразовать"Infinity"
в основание 19 в десятичную.Вот цифры в базе 19 вместе с их десятичными значениями:
Что происходит дальше, так это
parseInt
сканирование входных данных,"Infinity"
чтобы найти, какая его часть может быть проанализирована, и останавливается после принятия первогоI
(посколькуn
в базе 19 недопустимая цифра).Поэтому он ведет себя так, как если бы вы звонили
parseInt("I", 19)
, что преобразуется в десятичную 18 по таблице выше.источник
parseInt('Infini',24)
.n
тоже допустимая цифра, так что на самом деле это заканчиваетсяparseInt("Infini", 24)
.Вот последовательность событий:
1/0
оцениваетInfinity
parseInt
читаетInfinity
и радостно отмечает, чтоI
18 в базе 19parseInt
игнорирует остаток строки, так как он не может быть преобразован.Обратите внимание, что вы получите результат для любой базы
>= 19
, но не для баз ниже этой. Для баз>= 24
вы получите больший результат, которыйn
станет действительной цифрой в этой точке.источник
parseInt
будет принимать 36, поскольку в английском алфавите 26 букв, и принято использовать цифры, а не буквы как набор действительных цифр в данной базе.Infinity
на"Infinity"
...Чтобы добавить к ответам выше:
parseInt предназначен для разбора строк на числа (ключ в названии). В вашей ситуации вы вообще не хотите выполнять синтаксический анализ, поскольку 1/0 - это уже число, так что это странный выбор функции. Если у вас есть число (которое у вас есть) и вы хотите преобразовать его в конкретную базу, вы должны вместо этого использовать toString с основанием .
источник
Добавить к ответам выше
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)
ORparseInt("i",19)
результат будет таким же , то есть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
т.е.
источник