Выбор ответа Senior JSON и JSON Schema обновлено

Большие числа в JSON

Вопрос

API отдаёт {"id": 9007199254740993}. Фронтенд на JavaScript показывает 9007199254740992. В чём причина?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Числа в JS это double, целые больше 2^53 теряют точность. Number.MAXSAFEINTEGER равен 2^53 - 1.

Варианты ответа

  1. Сервер округлил число при сериализации, а фронтенд показал как есть
  2. JSON не поддерживает числа больше 2^31, и парсер обрезает старшие биты
  3. Ошибка кодировки UTF-8 при передаче длинной цифровой строки в теле
  4. Числа в JS это double, целые больше 2^53 теряют точностьправильный ответ

Разбор

Number.MAX_SAFE_INTEGER равен 2^53 - 1. Стандарт JSON размер чисел не ограничивает, но JSON.parse в JS превращает их в double, и младшие разряды теряются. Поэтому большие идентификаторы (например snowflake id) и деньги в копейках крупных сумм отдают строкой. Хороший тест для API с 64-битными id.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.