JSON.parse неправильно анализирует / конвертирует большие числа

Моя проблема действительно проста, но я не уверен, есть ли "родной" решение с использованием JSON.parse.

Я получаю этоstring из API:

{ "key" : -922271061845347495 }

Когда я использую JSON.parse для этой строки, это превращается вobject:

{ "key" : -922271061845347500 }

Как видите, анализ останавливается, когда число слишком длинное (вы можете проверить это поведениеВот). В нем только 15 точных цифр, последняя округлена, а после них установлено значение 0. Есть ли "родная" цифра? решение сохранить точное значение? (это идентификатор, поэтому я не могу его округлить)

Я знаю, что могу использовать regex для решения этой проблемы, но я бы предпочел использовать "native" метод, если он существует.

Ответы на вопрос(2)

Число слишком велико для правильного анализа.

Одним из решений является:

  1. Preprocessing your string from API to convert it into string before parsing.
  2. Preform normal parsing
  3. Optionally, you could convert it back into number for your own purpose.

Вот RegExp, чтобы преобразовать все числа в вашей строке (далее :) в строки:

 // convert all number fields into strings to maintain precision
 // : 922271061845347495, => : "922271061845347495",
 stringFromApi = stringFromApi.replace(/:\s*(\d+),/g, ': "$1",');
Решение Вопроса

Ваше предположение, что разборstops after certain digits это неверно.

Это говоритВот:

In JavaScript all numbers are floating-point numbers. JavaScript uses the standard 8 byte IEEE floating-point numeric format, which means the range is from:

±1.7976931348623157 x 10308 - very large, and ±5 x 10-324 - very small.

As JavaScript uses floating-point numbers the accuracy is only assured for integers between: -9007199254740992 (-253) and 9007199254740992 (253)

Ваш номер находится за пределами "точного" диапазон, следовательно, он преобразуется в ближайшее представление числа JavaScript. Любая попытка оценить это число (используя JSON.parse, eval, parseInt) приведет к потере данных. Поэтому я рекомендую передать ключ в виде строки. Если вы не управляете API, подайте запрос на добавление функции.

Ваш ответ на вопрос