Вопрос по json, numbers, floating-point, javascript – JSON.parse неправильно анализирует / конвертирует большие числа
Моя проблема действительно проста, но я не уверен, есть ли "родной" решение с использованием JSON.parse.
Я получаю этоstring из API:
{ "key" : -922271061845347495 }
Когда я использую JSON.parse для этой строки, это превращается вobject:
{ "key" : -922271061845347500 }
Как видите, анализ останавливается, когда число слишком длинное (вы можете проверить это поведениеВот). В нем только 15 точных цифр, последняя округлена, а после них установлено значение 0. Есть ли "родная" цифра? решение сохранить точное значение? (это идентификатор, поэтому я не могу его округлить)
Я знаю, что могу использовать regex для решения этой проблемы, но я бы предпочел использовать "native" метод, если он существует.
{ "key" : "-922271061845347495" }
Jashwant
Число слишком велико для правильного анализа.
Одним из решений является:
- Preprocessing your string from API to convert it into string before parsing.
- Preform normal parsing
- 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, подайте запрос на добавление функции.