bigint 的 JSON 传输:12000000000002539 转换为 12000000000002540?

IT技术 javascript json biginteger
2021-02-10 09:22:14

我正在传输原始数据,[{id: 12000000000002539, Name: "Some Name"}]并且[{id: 12000000000002540, Name: "Some Name"}]在解析后获取对象,现在服务器端将 id 转换为字符串似乎有帮助。但是有没有更好的方法来正确传输 bigint 数据?

1个回答

该值实际上没有超过 JavaScript 中的最大数值(“仅”1.7 308左右)。

然而,该值超过的“积分精度”的范围内。并不是发送了错误的数字:而是文字12000000000002539只能精确地表示为12000000000002540,因此JavaScript 中从来没有正确的数值。积分范围约为 +/- 2 53。)

这是使用双相对精度(IEEE-754 中的二进制 64)类型来存储所有数值(包括整数)的有趣现象

12000000000002539 === 12000000000002540 // true

精确存储为数值的十进制数字的最大有效位数为 15(实际上为 15.95)。上面有17位有效数字,所以一些最不重要的信息被悄悄丢失了在这种情况下,JavaScript 解析器/引擎读入文字值时。

在 JavaScript 中处理这种大小的整数的唯一安全方法是使用字符串文字或以另一种方式将其分解(例如自定义数字类型或“bigint 库”)。但是,我建议只使用 string,因为它是人类可读的,相对紧凑(JSON 中只有两个额外的字符),并且不需要特殊的序列化。由于在这种情况下该值只是一个“id”,我希望不需要对其进行数学运算:)

快乐编码。

值得注意的是,JSON ( RFC 4627 ) 不保证 JSON 消费者需要能够表示的数字范围,因此其他客户端的答案可能不同:“实现可能会对数字范围设置限制。”
2021-04-07 09:22:14