解决后端返回Long类型的数据前端精度丢失问题

817 阅读1分钟

1、解决后端返回Long类型的数据前端精度丢失问题

遇到了后端返回的某个字段的数字太长,导致前端展示的时候数字变成了科学计数法,有些甚至直接展示错误;

image.png

原因:

典型的JS精度丢失问题,JS 中的Number类型只能安全地表示 -9007199254740991 (-(2^53-1)) 和9007199254740991(2^53-1) 之间的整数,任何超出此范围的整数值都可能失去精度。

解决方案:

我们的项目是Vue + Axios,因此就用Axios举例了,其实操作很简单,别眨眼,看我操作!

1、首先安装 json-bigint 的插件

yarn add json-bigint
//或者
npm i json-bigint

2、接下来,在axios中这样配置就大功告成了

//request.js
import axios from 'axios';
import JSONbig from 'json-bigint';
 
const JSONbigToString = JSONbig({ storeAsString: true })
 
const service = axios.create({
  timeout: 50_000,
  baseURL: '',
  transformResponse: [function (data) {
    try {
      //转换
      return JSONbigToString.parse(data)
 
    } catch (err) {
      //转换失败就直接按原数据返回
      return data;
 
![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8b0e0ceea58f44d9ab409c3ed307601d~tplv-k3u1fbpfcp-watermark.image?)
    }
  }]
});

2、计算百分数精度问题

WeChata0ac6d70c5ca259da55e9c2baf71cb5b.png

 computed: {
   // 综合评分
    averageScore() {
        if (this.tableFormData.tableData.length) {
            let count = 0;
            this.tableFormData.tableData.forEach(item =>{
              let weight = this.$currency(item.weight,{precision:4}).divide(100).value
              let num = this.$currency(item.score,{precision:4}).multiply(weight).value
              count += num
        });
                return isNaN(count) ? 0 : count.toFixed(2);
            } else {
                    return 0;
            }
        }
  },