8

Почему parseInt(1/0, 19) возвращает 18?

8

У меня есть надоедливое проблема в JavaScript.

Я столкнулся с странным поведением функции parseInt. Вот пример:

> parseInt(1 / 0, 19)
> 18

Почему функция parseInt возвращает 18?

2 ответ(ов)

2

Вот последовательность событий:

  1. Выражение 1/0 возвращает Infinity.
  2. Функция parseInt считывает Infinity и с удовольствием замечает, что I — это 18 в системе счисления с основанием 19.
  3. Функция parseInt игнорирует оставшуюся часть строки, поскольку она не может быть преобразована.

Обратите внимание, что вы получите результат для любого основания >= 19, но не для оснований ниже этого. Для оснований >= 24 вы получите большее значение, так как n становится допустимой цифрой в этом случае.

0

Чтобы добавить к уже приведённым ответам:

parseInt(1/0, 19) эквивалентен parseInt("Infinity", 19).

В числах с основанием 19 допустимыми являются цифры от 0 до 9 и буквы A-I (или a-i). Из строки "Infinity" функция берет символ I, который в 19-ричной системе соответствует 18 в десятичной системе. Затем она пытается взять следующий символ — n, который отсутствует в 19-ричной системе, поэтому все последующие символы игнорируются (это поведение JavaScript при преобразовании строки в число).

Таким образом, если вы вызовете parseInt("Infinity", 19) или parseInt("I", 19) или parseInt("i", 19), результат будет одинаковым и равным 18.

Если же вы вызовете parseInt("I0", 19), результат будет 342, так как:

I × 19^1 + 0 × 19^0 = 18 × 19^1 + 0 × 19^0 = 18 × 19 + 0 × 1 = 342.

Аналогично, вызов parseInt("I11", 19) даст результат 6518, что можно рассчитать так:

18 × 19^2 + 1 × 19^1 + 1 × 19^0
= 18 × 19^2 + 1 × 19^1 + 1 × 19^0
= 18 × 361 + 1 × 19 + 1 × 1
= 6498 + 19 + 1
= 6518
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь