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

fei*_*ang 48 javascript json biginteger

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

小智 88

该值实际上超过JavaScript中的最大数值("仅"1.7 308左右).

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

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

12000000000002539 === 12000000000002540 // true
Run Code Online (Sandbox Code Playgroud)

精确存储为数值的最大有效小数位数为15(实际为15.95).在上面,有17位有效数字,因此一些最不重要的信息会无声地丢失.在这种情况下,作为 JavaScript的解析器/引擎的文本值读取.

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

快乐的编码.

  • 值得注意的是,JSON([RFC 4627](http://www.ietf.org/rfc/rfc4627))不保证JSON使用者需要能够表示的数字范围,因此答案可能会有所不同.其他客户:"实施可能会对数字范围设置限制." (9认同)
  • 惊人的事! (2认同)