小心JS中数字精度损失

一、背景

昨日,有开发反应在edi的日志里发现一个异常现象:“JSON字符串反序列化后,数字值不对了”。类似如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
反序化前:
[{"itemNo": 1209740960010041001},
{"itemNo": 1209740960010041002},
{"itemNo": 1209740960010041003},
{"itemNo": 1209740960010041004},
{"itemNo": 1209740960010041005},
{"itemNo": 1209740960010041006},
{"itemNo": 1209740960010041007}]

反序列化后:
[{"itemNo": 1209740960010041000},
{"itemNo": 1209740960010041000},
{"itemNo": 1209740960010041000},
{"itemNo": 1209740960010041000},
{"itemNo": 1209740960010041000},
{"itemNo": 1209740960010041000},
{"itemNo": 1209740960010041000}]

二、解决路径

  1. 通过日志的DevTool中查看请求数据的Response,发现是正常的;这个也通过直接查询es中的数据得到了认证。
  2. 由此判断后台的数据是正常的,大概率是由于前端JS格式化显示json时,在JS中损失了精度。
  3. 通过测试和查询资料确认JS中数字是通过IEEE-754 double-precision floating point存储的,类似Java中的double类型的存储方式,过大的数字会损失精度。

三、 参考资料

  1. https://stackoverflow.com/questions/1379934/large-numbers-erroneously-rounded-in-javascript
  2. https://mailarchive.ietf.org/arch/msg/json/N0GtwREVuq1ZREGEMZNswRurfXI/

评论