前端大数字精度丢失问题

项目中突然遇到数据提交出错,通知后端时说我返回数据有问题。
9137822703981626000 这串数字是我收到的后端返回的编号数据,实际后端数据为 9137822703981626197。
造成这个的原因就是后端返回数据过大,超过了16位的整数,而js解析只能解析到16位,超过16位就会丢失精度,类似于浮点数的运算误差,这是属于语言限制
解决方式:
我的项目是vue项目,用的axios做的接口交互,axios提供了专门的API,transformResponse去自定义转换后端返回的数据类型
json-bigint是专门处理js大数据失真的第三方包

首先:

npm install json-bigint

下载json-bigint包

var jsonBig = require('json-bigint')({ "storeAsString": true });

之后引入

service.defaults.transformResponse = [
    function(data) {
        try {
            // 正常同通过return JSON.parse(data)对数据进行转换
            // 但是转化完成的数据可能超出安全数据长度
            // 因此我们定制使用第三包来转化
            return jsonBig.parse(data)
        } catch (err) {
            console.log(err);
            // 转换失败返回一个空对象
            return {}
        }
    }
]

之后在request文件中配置就OK了。

因为我们项目的配置原因,所有页面的编号之类的信息都是特别长的整数,后端都反了,我们只能解决。而造成这个的根本原因就是类型问题,我们也可以在接收数据时直接将数据转换为string类型,再去处理。

但是!!!之后我发现,我在操作数据用于form表单,带校验的时候,就会报错,无法获取数据,找了很多种方法,都没能解决。最后尝试使用解构赋值,将需要赋值到form表单的数据通过解构赋值的方式解构出来到一个新的对象里面才可以,具体的问题我也没找出来,能力有限,之后有时间会好好研究。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值