今天在项目中无意中发现一个问题,后端返回的两个数据,一个是整数3,一个是浮点数30.24,我在前端将两个数相加后,发现结果并不是33.24 ,而是33.239999999999995
1、问题出现原因
为什么会出现这个问题呢,其实是在JS内部所有的计算都是以二进制方式计算的。 所以当运算 0.1+ 0.2 时要先把 0.1和 0.2 从十进制转成二进制,转成二进制后是无穷的,所以在运算中出现了精度丢失问题,导致最后结果不准确。
具体运算方法请看这里: 非科班前端人的一道送命题:0.1+0.2 等于 0.3 吗?
数据是这样的
相加后是这样的
2、 解决办法
/**
* 解决 两个浮点数相加或浮点数和整数相加后结果为无限循环小数,出现精度丢失
*/
add(arr) {
let fieldArr = []
let filed = 0
arr.forEach((item,i) => {
try{
filed = arr[i].toString().split('.')[1].length
} catch(e) {
filed = 0
}
fieldArr.push(filed)
});
let m = Math.pow(10, Math.max(...fieldArr));
let add = 0
arr.forEach((item)=>{
add = add + item * m
})
let sum = Math.round(add) / m
console.log(sum,"sum")
return sum
}