[交互问题]axios交互的数值精度丢失问题

axios是用于前后端交互的插件,但是当传递的数值长度过长时会导致数值的精度丢失

问题描述

axios获取的数据中有超过16位的数字 ,精度会丢失,后面的数据会变为0,确切的说17位的时候,有时数据出现问题,有时没有

类型
Number.MAX_SAFE_INTEGER Math.power(2,53)-1=9007199254740991,
Number.MAX_VALUE 1.7976931348623157 x 10308
Number.MIN_SAFE_INTEGER -(253 - 1),
Number.MIN_VALUE 5 x 10-324 = 5e-324

Axios 交互可以接收的最大长度Number.MAX_SAFE_INTEGER

但是真实情况是16位的时候《=9999999999999998,无精度问题,9999999999999999就会存在精度问题变成10000000000000000

解决方案

包括:

  • 改变传递的类型
  • 转换为字符串

改变传递的类型

该方式主要是服务端返回的数据类型直接转变为string类型,因为该方式可能涉及到数据库对应字段的类型,如果该方式不方便,可采用第二种方式,前端直接对接收到的数据类型做处理

转换为字符串

import jsonBig from 'json-bigint'
[{itemId:9999999999999988,itemName:'testone'}]
axios.get(Api.path, { params: param,transformResponse: [function (data) {
                // 对 data 进行任意转换处理
                try {// 如果转换成功则返回转换的数据结果
                    let temp=jsonBig.parse(data)
                    let list=temp.data.list
                    if(null!=list && undefined!=list){
                        list.map((item,index)=>{
                            if(null!=item.itemId && undefined!=item.itemId){
                                item.itemId=item.itemId.toString();//转换为string类型
                            }
                            return item;
                        })
                    }
                    return temp
                  } catch (err) {
                    return {// 如果转换失败,则包装为统一数据格式并返回
                      data
                    }
                  }
              }] }).then((res: any) => {
		//.......
            }).catch(e => {
		//.......
            });

你可能感兴趣的:(前端模块开发,前端)