在请求一个接口获取数据时,发生了一件诡异的事情:
接口返回值id字段为long类型,但是在控制台上看接口返回值时,preview与response标签下两个值不一样
preview标签下会解析成json格式查看,这个值是错误的。
response标签下是接口原始返回值,这个值是对的。
经过排查,发现是语言间精度的问题,原因是:由于JavaScript中Number类型自身的原因,并不能完全表示Long型的数字,在Long长度大于17位时会出现精度丢失的问题。
问题复现:
我们直接在java中使用Long.MAX_VALUE获取Long类型的最大值,结果为:
9223372036854775807
然后打开Chrome浏览器,打开控制台,切换到console标签页,直接执行如下语句:
console.log(9223372036854775807)
其实直接粘贴9223372036854775807也能看到效果
可以看到,数值已经错了。
解决办法:
1、后端对于Long类型使用String字符串输出
2、前端支持Long类型,参考:https://segmentfault.com/a/1190000009599204