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

  • Post author:
  • Post category:其他




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);
},



版权声明:本文为qq_39454432原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。