Передача JSON bigint: 12000000000002539 преобразуется в 12000000000002540?

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

Ответ 1

Значение на самом деле не превышает максимальное числовое значение в JavaScript (это "только" 1.7 308 или так).

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

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

12000000000002539 === 12000000000002540 // true

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

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

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