node获取第三方返回的number数据超过19位精度丢失问题?
问题: 最近在实现一个需求的时候,需要接入第三方的接口,调取第三方接口返回json中的number数据超过19位(2^53-1)导致数据部分位数?
原因: js的number类型有个最大安全值,即2的53次方(9007199254740992),超过这个值就会出现精度丢失的问题。
环境:使用的node、axios进行请求接口
解决方案:
方法一:
1. 引入json-bigint库 npm install json-bigint
2. 在axios请求返回的数据,在json传输转化前进行操作返回数据,使用JSONbig.parse会将number类型转化成string
const JSONbig = require('json-bigint');
const service = axios.create({
transformResponse: [function (data) {
return JSONbig.parse(data)
}]
})
方法二:
直接在axios返回的json数据进行正则替换,返回数据如下
let result = '{"c_id":6839147426382037005,"status":"0"}'
const cId = result.match(/[0-9]{19}/)[0] // 正则获取19位数字的值
const cId = result.match(/[0-9]{19}/)[0] // 正则获取19位数字的值
result = result.replace(taskId,`"${cId}"`) // 补上双引号转化成字符串
const data = JSON.parse(result)