Ошибка, которую, наверное, все совершали

Моя подруга Лили работает уже 5 лет, и в прошлом она работала фронтенд-инженером.

К сожалению, ее босс раскритиковал ее за то, что она допустила ошибку на работе, что является очень простой проблемой, но ее легко игнорировать.

Описание этой ошибки

Вопрос, вероятно, звучит примерно так.

Лили отвечала за важный проект в компании, и один из модулей должен был отображать часть информации, связанной с числами.

Это информация, возвращаемая интерфейсом внутреннего инженера (просто пример)

Друзья мои, какая информация будет возвращена, когда мы вызовем интерфейс getInfo? Будет ли это 123456789123456789?

Как вы можете видеть через инструменты отладки браузера Chrome, кажется, что все так же, как мы думали, результат 123456789123456789.

Но на странице отображается результат 123456789123456780, последняя цифра 0 вместо 9

Что, черт возьми, происходит? Это слишком странно.

Анализ причин

Я попытался проанализировать возвращенные цифры и обнаружил, что проблема несоответствия в последних нескольких цифрах возникает только тогда, когда цифры превышают 16 цифр.

Это потому, что числа слишком велики и произошла потеря точности?

Тип Long в языке Java составляет 64 бита. Является ли тип Long в языке JavaScript менее 64 бит?

Omg, JavaScript, кажется, не имеет данных типа Long!

На самом деле, в JavaScript мы используем число для представления значения номера типа.

Общая длина типа Number составляет 64 бита. Примерно таким образом распределяются 64 бита, из которых 53 бита представляют собой десятичный разряд, 10 бит представляют собой бит экспоненты, а 1 бит представляет бит знака. Следовательно, диапазон представления целого числа Number равен -2^53 ~ 2^53.

Попробуем вывести в консоль максимальное и минимальное значения в JavaScript.

В других языках, таких как Java, тип Long занимает 64 двоичных бита с максимальным значением 9223372036854774807 (2⁶³ — 1) длиной около 19 бит.

В JavaScript, поскольку значение типа Number также содержит десятичные знаки, максимальное значение равно 9007199254740993 (2^53 - 1), а длина составляет около 16 бит.

Поэтому, когда Java возвращает поля типа Long с более чем 16битамив JSON, данные, полученные интерфейсным JavaScript, теряют точность из-за переполнения.

Как решить эту проблему?

Может быть, мы можем попытаться решить эту проблему на фронтенде, но я думаю, нам следует обратиться за помощью к бэкенд-инженерам.

Мы должны преобразовать переменные числового типа (Long), которые могут находиться за пределами допустимого диапазона, в строковый тип (String).

Окончательно

Спасибо, что прочитали. Я с нетерпением ждувашей подписки и новых качественных статей.



«Я потерял работу только из-за Promise.all
Опыт собеседования, который меня так огорчил.javascript.plainenglish.io»





Интервьюер: Что случилось с «npm run xxx?
Секрет, о котором не знает большинство людей.javascript.plainenglish.io»





Интервьюер: Может ли «x !== x возвращать True в JavaScript?
Пять волшебных знаний в области JavaScript, о которых вы, возможно, не знали!javascript.plainenglish.io»





Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord . Заинтересованы в хакинге роста? Ознакомьтесь с разделом Схема.