Всем привет, любители JavaScript! Недавно ко мне обратился мой товарищ, который совсем недавно начал изучать JavaScript с таким вопросом: Почему parseInt(0.0000005) возвращает 5? Я сначала очень удивился и решил проверить это, действительно ли это так? (Да, это так!).
Почему parseInt(0.0000005) === 5?
Вы можете это с легкостью проверить сами:
const num = parseInt(0.0000005);
console.log(num); // 5
Вопрос очень интересный, почему же так происходит? Давайте разбираться вместе. Начнем по порядку, первый вопрос, на который нам стоит ответить, что такое parseInt? Давайте обратимся к документации на MDN:
Функция
parseInt()
принимает строку в качестве аргумента и возвращает целое число в соответствии с указанным основанием системы счисления.
Кажется, что все предельно ясно. Но проблема в том, что мы передаем не строку, а число. Т.е. если мы сделаем так, как от нас требует функция parseInt()
, а именно — передадим строку, она отработает верно и выдаст нам 0.
const num = parseInt('0.0000005');
console.log(num); // 0
Но почему так? Почему функция parseInt()
работает именно так? Для этого нам стоит обратиться к документации ECMAScript. Нас очень сильно интересует то, как работает функция parseInt в JavaScript. Переходим и читаем:
Нас интересует пункт 1 (выделил красным). Т.е. мы видим, что функция проверяет первым делом, а строка ли это? Если это строка, то привести к числу. А вот если это не строка, то привести к строке. Если говорить понятно и доступно, вот что делает функция:
Если тип приходящих данных строковой
string
, тогда привести его к числовому типуnumber
. НО! Если тип приходящих данных итак уже является числовымnumber
, тогда функция приводит его к строке (string
), а потом снова к числу (number
)!т.е.
string
->number
но:number
->string
->number
Вот вам и вся магия! А теперь давайте посмотрим, как же отрабатывает код. Давайте вручную преобразим наше число в строку:
const num = String(0.0000005);
console.log(num); // 5e-7
5e-7 — вот что мы получаем. Теперь у нас есть такая строка. Давайте попробуем эту строку преобразить в число.
const num = parseInt('5e-7');
console.log(num); // 5
Мы получаем 5. Почему? Всё предельно просто. Интерпретатор parseInt
пытается найти числовое значение после 5, но не может этого сделать, потому что там идет буква «e». И что же делает parseInt
? Он просто отбрасывает эту часть как что-то ненужное и возвращает нам 5.
Элементарно, Ватсон!)
Новая загадка
Теперь, когда вы знаете почему так происходит и на основе имеющихся у вас данных, которые я показал выше. Сможете ли вы теперь ответить, почему консоль выведет 1?
const num = parseInt(99999999999999999999999999);
console.log(num); // 1