现象:
后端返回 id字段是使用 “雪花算法”生成的,19位,但是在前端查看的时候,反显后几位都是0了,精度丢失!
- 接口地址直接在浏览器打开(get),显示正常:
- 在netWork中查看接口返回:
此时数字已经丢失精度了!
解决
-
后端注解:https://blog.csdn.net/weixin_46286156/article/details/124819784
https://zimug.blog.csdn.net/article/details/108212633
插件:json-bigint
yarn add json-bigint
//或
npm install json-bigint
axios.defaults.transformResponse = [
function (data) {
const json = JSONBIG({
storeAsString: true
})
const res = json.parse(data)
return res
}
]
丢失精度的原因:
https://juejin.cn/post/7264208575973621815
场景:
- 浮点数的计算,包括加减乘除,都会这样。eg:
正常计算:0.1 + 0.2 = 0.3
JavaScript 计算:0.1 + 0.2 = 0.30000000000000004
正常计算:1 - 0.9 = 0.1
JavaScript 计算:1 - 0.9 = 0.09999999999999998
- 超过最值:js 16位,后端雪花返回19位。准确说是:±9007199254740991。
- 保留指定小数位。
console.log(1.585.toFixed(2)) // 1.58 ——> 期望为:1.59
原因:转二进制的时候,出问题了。
实际上会底层会进行 十进制 和 二进制 的相互转换,而这个转换过程就有可能会出现 精度丢失,因为十进制转二进制后可能产生 无限循环 部分,而 实际存储空间是有限的。