У мене дратує проблема в JavaScript .
> parseInt(1 / 0, 19)
> 18
Чому parseInt
функція повертається 18
?
У мене дратує проблема в JavaScript .
> parseInt(1 / 0, 19)
> 18
Чому parseInt
функція повертається 18
?
Відповіді:
Результатом 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 за таблицею вище.
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 з радіусом .
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)
то результат буде однаковим, тобто 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
if
може допомогти.