На самом деле существует ограничение на уровне точности JavaScript / ECMAScript до 53 бит для целых чисел (они хранятся в мантиссе «двойного» 8-байтового буфера памяти). Поэтому передача больших чисел в формате JSON не будет сериализована, как ожидается клиентом JavaScript, который урезает их до 53-битного разрешения.
> parseInt("10765432100123456789")
10765432100123458000
См. Number.MAX_SAFE_INTEGER
константа и Number.isSafeInteger()
функция:
Константа MAX_SAFE_INTEGER
имеет значение 9007199254740991
.
обоснование этого числа заключается в том, что JavaScript использует двойную точность
Числа в формате с плавающей запятой, как указано в IEEE 754 и могут только
безопасно представлять числа между -(2^53 - 1)
и 2^53 - 1
.
Безопасный в этом контексте относится к способности представлять целые числа
точно и правильно их сравнить. Например,
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2
будет
оцените true
, что математически неверно. Увидеть
Number.isSafeInteger()
для получения дополнительной информации.
Из-за разрешения числа с плавающей точкой в JavaScript использование "64-битных чисел с плавающей точкой", как вы предлагали, будет иметь те же ограничения.
ИМХО лучшим вариантом является передача таких значений в виде текста. Это будет все еще отлично читаемый контент JSON, и с ним будет легко работать на уровне JavaScript.
Представление «чистая строка» - это то, что указывает OData для его Edm.Int64
или Edm.Decimal
типов .
В этом случае API-интерфейс Twitter добавляет в JSON определенное поле ".._str":
, например:
{
"id": 10765432100123456789, // for JSON compliant clients
"id_str": "10765432100123456789", // for JavaScript
...
}
Мне очень нравится этот параметр, так как он по-прежнему совместим с клиентами, поддерживающими int64. На практике такой дублированный контент в JSON не сильно повредит, если его дефлировать / сжать на уровне HTTP.
После передачи в виде строки вы можете использовать библиотеки, такие как strint - библиотека JavaScript для строковых кодированных целых чисел для обработки таких значений.