Вопрос по json, numbers, floating-point, javascript – JSON.parse неправильно анализирует / конвертирует большие числа

8

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

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

{ "key" : -922271061845347495 }

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

{ "key" : -922271061845347500 }

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

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

Это предлагает несколько ответов: [поток переполнения стека] [1] [1]:stackoverflow.com/questions/209869/… Paul Jowett
Вы можете сделать это строкой? James Allardice
Попробуй,{ "key" : "-922271061845347495" } Jashwant
Спасибо, я, вероятно, не искал с хорошими ключевыми словами, причина, почему я не нашел эти объяснения. В качестве решения я отправляю данные в виде строки и преобразую их в число на стороне API, таким образом, БД продолжает использовать целые числа как идентификаторы. Simon

Ваш Ответ

2   ответа
0

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

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

  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",');
16

Ваше предположение, что разбор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, подайте запрос на добавление функции.

Поскольку я должен сохранить эффективность API, я все еще буду использовать номер. Клиент отправит идентификатор в виде строки, и я приведу его в число на стороне API. Simon
@ Салман A: Спасибо за ваши объяснения и советы. Я, вероятно, немного подожду, прежде чем создавать свой собственный парсер и отправлять ключи в виде строк, а затем анализировать их в число на стороне API. Simon
Это на самом деле не отвечает на вопрос. & quot; Есть ли собственное решение для сохранения точного значения? & quot;
@ G4llic4: решение зависит от того, управляете ли вы API или нет. Если вы это сделаете, идти вперед и изменитьkey в строку (при условии, что вам не нужно делать какие-либоmath в теме).
Родным решением было бы написать свой собственный анализатор JSON, который анализирует числа как строки.

Похожие вопросы