前端数字丢失精度问题

问题描述

针对比较大的数值类型,比如: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对象。解决问题

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容