bigint的JSON传输:12000000000002539转换为12000000000002540

JSON transfer of bigint: 12000000000002539 is converted to 12000000000002540?

本文关键字:转换 12000000000002540 12000000000002539 JSON 传输 bigint      更新时间:2023-09-26

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

该值实际上是不超过JavaScript中的最大数值("仅" 1.7308左右)。

但是超出了"整型精度"的范围。这并不是说发送了错误的数字:相反,是文字 12000000000002539 只能精确地表示为 12000000000002540,因此在JavaScript中没有正确的数值。(积分范围约为+/- 253)

这是一个有趣的现象,使用双相对精度(在IEEE-754中为binary64)类型来存储所有数值,包括整数:

12000000000002539 === 12000000000002540 // true

精确存储为数值的十进制位数的最大有效位数是15(实际上是15.95)。在上面,有17位有效数字,所以一些的最低有效信息被静默地丢失了。在本例中,作为JavaScript解析器/引擎读入的文本值。在JavaScript中处理这种大小的整数的唯一安全方法是使用字符串字面值或以另一种方式将其分解(例如自定义数字类型或"bigint库")。但是,我建议只使用字符串,因为它是人类可读的,相对紧凑(在JSON中只有两个额外的字符),并且不需要特殊的序列化。由于该值在本例中只是一个"id",我希望不需要对其执行数学运算:)

快乐编码。