Ajax请求服务端long类型的数据精度失真处理
原因: Js是弱类型的语言,在变量声明时不会限制数据类型,所以后端返回的什么数据类型前端接收到之后就是什么数据类型,js中用53位保存数据,能精准表示的最大证书是Math.pow(2, 53),十进制即 9007199254740992,后端返回的long类型的数据大于这个数,所以使用js的数字类型保存long类型的数据类型时就出现了失真的问题,前端接收到的已经不是服务端返回的真实数据了
解决方法:
- 服务端解决:服务端将long类型的数据转化为字符串类型再发送给前端,前端接收到的数据是字符串类型就不会出现失真问题,完美解决
- 前端解决:
思路:前端只要用变量保存后段返回的long类型的数据就会出现失真问题,必须要先将服务端返回的long类型的数据转化为字符串类型再使用JSON.parse()解析
(1)比较简单的方法就是使用第三方库转化,例如 json-bigint库,使用axios中的
transformResponse: [data => JSONBig.parse(data)]属性即可
(2)自己写函数修改,请求数据时添加属性dataType:’text’,在知道服务端字段的情况下可以直接将该字段对应的long类型的数据通过正则匹配转化为字符串类型
getRealJsonData(baseStr) {
if (!baseStr || typeof baseStr != 'string') return;
let goodsIdArr = baseStr.match(/"goodsId":(\d+)/g)
goodsIdArr.forEach(item => {
let arr = item.split(':')
baseStr = baseStr.replace(arr[1], '"' + arr[1] + '"')
})
return JSON.parse(baseStr);
},