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 => {
//.......
});