JSON перевод bigint: 12000000000002539 конвертируется в 12000000000002540? - PullRequest
48 голосов
/ 29 декабря 2011

Я передаю необработанные данные, такие как [{id: 12000000000002539, Name: "Some Name"}], и получаю объект [{id: 12000000000002540, Name: "Some Name"}] после синтаксического анализа, а пока преобразование идентификатора в строку на стороне сервера, похоже, помогает. Но есть ли лучший способ правильно передать данные bigint?

1 Ответ

87 голосов
/ 29 декабря 2011

На самом деле значение не превышает максимальное числовое значение в JavaScript («всего» 1,7 308 или около того).

Однако значение на превышает диапазон «интегральной точности».Дело не в том, что отправляется неправильный номер: скорее, литерал 12000000000002539 может быть представлен только с такой точностью, как 12000000000002540, и, таким образом, никогда правильное числовое значение в JavaScript.(Диапазон интегралов равен +/- 2 53 .)

Это интересное явление использования двойной относительной точности (двоичный код 64 на языке IEEE-754) для хранения всех числовых значений, включая целые числа:

12000000000002539 === 12000000000002540 // true

Максимальное значимое количество десятичных цифр, которые точно сохраняются в виде числового значения, равно 15(15,95, действительно).Выше указано 17 значащих цифр, поэтому часть из наименее значимой информации молча теряется .В этом случае как синтаксический анализатор / обработчик JavaScript считывает литеральное значение.

Единственный безопасный способ обработки целых чисел этой величины в JavaScript - это использование строкового литерала или разбиениеэто по-другому (например, пользовательский числовой тип или "bigint library" ).Однако Я рекомендую просто использовать строку , так как она удобочитаема, относительно компактна (всего два дополнительных символа в JSON) и не требует специальной сериализации.Поскольку в данном случае значение является просто «id», я надеюсь, что математика не должна выполняться на нем:)

Счастливое кодирование.

...