问题描述
针对比较大的数值类型,比如:1857260970794627073
前端js处理的时候,默认会将后面几位数字变成0,变成了1857260970794627000,也就是丢失精度
处理方案
方案1:前端转换
这是我网上找到的一种方案。使用json-bigint
npm install json-bigint@1.0.0
import axios from 'axios'
import jsonBig from 'json-bigint'
//利用axios对象的方法create,去创建一个axios实例
const api = axios.create({
baseURL: "http:xxxxxxxxx", // 后端地址
timeout: 60000, // 请求超时时间
transformResponse: [function (data) {
//transformResponse这个配置项可以拦截接口返回的内容进行处理
try {
// 如果大数字类型转换成功则返回转换的数据结果
return jsonBig.parse(data);
} catch (err) {
// 如果转换失败,代表没有长数字可转,正常解析并返回
return JSON.parse(data)
}
}]
})
export default api
方案2:后端转换
由于这个是通用问题,而且有多个后端服务,对应不同的前端工程。
所以这个是我实际采用的方案
通过将Long类型的id字段序列化为String类型,保证前端能接收到完整的内容
private static final ObjectMapper MAPPER = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Long.class, new JsonSerializer<>() {
@Override
public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value!= null) {
if("id".equals(gen.getOutputContext().getCurrentName())) {
gen.writeString(String.valueOf(value));
} else {
gen.writeNumber(value);
}
}
}
});
MAPPER.registerModule(module);
然后在配置类里,将ObjectMapper声明为bean对象。解决问题