long long类型上限_后端返回long类型长度超出浏览器限制导致JS精度缺失,浏览器自动把超出部分用0表示解决方案...

当后端返回的long类型数值超过浏览器JSON.parse精度限制时,会导致精度缺失。通过在后端将数值转换为字符串,然后在前端解析时遍历JSON字符串,找到大数值并将其包裹在引号中,从而在解析时避免转换为Number,解决这个问题。测试发现,Chrome在17位数值时开始出现精度问题,18位数值末尾会被自动补0。
摘要由CSDN通过智能技术生成

1.后端把返回值的字段减少一点

2.后端把返回值转成String类型,然后接收的时候把String类型转回long类型

但是1有场景限定

对于1来说 项目已经上线的话字段更改代价比较大,所以需要用到2方法

但是2方法对于前端来说有时候也并不是那么的好用

尽管后端返回的是字符串因为请求返回的时候会用JSON.parse(response)来解析后端返回的字符串这个时候就凉凉了,那么有办法解决吗?有的,不多CC直接上方法。

对接收的值作处理

const res = getRealJsonData(response.request.responseText); //直接放要解析的json字符串

function getRealJsonData(baseStr) {

if (!baseStr || typeof baseStr != 'string') return;

var jsonData = null;

try {

jsonData = JSON.parse(baseStr);

} catch (err) {

return null;

}

var needReplaceStrs = [];

loopFindArrOrObj(jsonData, needReplaceStrs);

needReplaceStrs.forEach(function (replaceInfo) {

var matchArr = baseStr.match(eval('/"' + replaceInfo.key + '":[0-9]{15,}/'));

if (matchArr) {

var str = matchArr[0];

var replaceStr = str.replace('"' + replaceInfo.key + '":', '"' + replaceInfo.key + '":"');

replaceStr += '"';

baseStr = baseStr.replace(str, replaceStr);

}

});

var returnJson = null;

try {

returnJson = JSON.parse(baseStr);

} catch (err) {

return null;

}

return returnJson;

}

遍历数组类型

function getNeedRpStrByArr(arr, needReplaceStrs) {

for (var i = 0; i < arr.length; i++) {

var value = arr[i];

loopFindArrOrObj(value, needReplaceStrs);

}

}

递归遍历

function loopFindArrOrObj(value, needRpStrArr) {

var valueTypeof = Object.prototype.toString.call(value);

if (valueTypeof == '[object Object]') {

needRpStrArr.concat(getNeedRpStrByObj(value, needRpStrArr));

}

if (valueTypeof == '[object Array]') {

needRpStrArr.concat(getNeedRpStrByArr(value, needRpStrArr));

}

}

遍历对象类型

function getNeedRpStrByObj(obj, needReplaceStrs) {

for (var key in obj) {

var value = obj[key];

if (typeof value == 'number' && value > 9007199254740992) {

needReplaceStrs.push({

key: key

});

}

loopFindArrOrObj(value, needReplaceStrs);

}

}

浏览器精度测试

let num = 1616161616161616, num1 = 17171717171717171, num2 = 181818181818181818;

// 打印结果

num: 1616161616161616 // 没有变化,还顶得住

num1: 17171717171717172 // 结果好像只是+1了

num2: 181818181818181820 // 结果好像+2了

// 经过一系列的测试在17位的时候原数值有时候会+1,有时候不变,不知道什么情况。。。18位最后一位永远是0,倒数第二位好像没有规律可言,测试半天没发现什么规律

总结

使用这个方法可以在转义之前把精度会缺失的字符串在外面再包一层字符串 像这样子 '"111111111111111111"',这样子在解析的时候就能避免浏览器在使用JSON.parse()方法的时候把后端返回的字符串转成Number而导致超出浏览器限制范围(chrome是17位就开始作妖,18就补0)其他浏览器暂时没测试过,欢迎各位大佬科普

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值