JavaScript: Почему parseInt(0.0000005) === 5?

JavaScript: Почему parseInt(0.0000005) === 5? JavaScript

Всем привет, любители 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. Переходим и читаем:

JavaScript: Почему parseInt(0.0000005) === 5?
JavaScript: Почему parseInt(0.0000005) === 5?

Нас интересует пункт 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

Оцените статью
GeekБлог
Добавить комментарий