前端接收服务端返回long类型的数据精度失真问题

Ajax请求服务端long类型的数据精度失真处理

原因: Js是弱类型的语言,在变量声明时不会限制数据类型,所以后端返回的什么数据类型前端接收到之后就是什么数据类型,js中用53位保存数据,能精准表示的最大证书是Math.pow(2, 53),十进制即 9007199254740992,后端返回的long类型的数据大于这个数,所以使用js的数字类型保存long类型的数据类型时就出现了失真的问题,前端接收到的已经不是服务端返回的真实数据了

解决方法:

  1. 服务端解决:服务端将long类型的数据转化为字符串类型再发送给前端,前端接收到的数据是字符串类型就不会出现失真问题,完美解决
  2. 前端解决:
    思路:前端只要用变量保存后段返回的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);
},
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

www.www

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值