表现形式

number 类型的精度丢失

我们打开浏览器F12,输入17个8,查看返回值。

  1. 输入:88888888888888888
  2. 输出:88888888888888900

可以看到,最后两位是不同的,这就是「精度丢失 bug」。

JSON.parse 中的精度丢失

同样在浏览器F12中

  1. 输入:JSON.parse('{"largeNumber":88888888888888888}')
  2. 输出:{largeNumber: 88888888888888900}

出现原因

这个 bug 的原因是 js 最多可以表示 [JS] JSON.parse 数字精度丢失 bug - 图1的整数。
Number.``MAX_SAFE_INTEGER=9007199254740991
超过的值都会丢失精度。

解决方案

方案一:与后端约定,针对超长数字使用 string 类型传递

方案二:手动做 parse 解析

参考第三方库:json-bigint https://github.com/sidorares/json-bigint