两个浮点数相加可能出现的精度问题:
console.log(1.05+2.1);
解决思路:
1、判断两个数小数点后位数
2、根据长的来计算 - length
3、值1 = 值1 * Math.pow(10,length),值2 = 值2* Math.pow(10,length)
4、sum = (值1 + 值2 )/(Math.pow(10,length))
使最终得到的结果能够保留精度
上代码!!!
function sum(voucherList) {
return voucherList.reduce((AmountSum, currVoucher) => {
// 传值为字符串的情况
currVoucher.debitAmount = parseFloat(currVoucher.debitAmount);
let tempSum = AmountSum.toString();
let Amount = currVoucher.debitAmount.toString();
//小数点后数位校对
let decimalPart1 = tempSum.split('.')[1] || '';
let decimalPart2 = Amount.split('.')[1] || '';
let decimalLength1 = decimalPart1.length;
let decimalLength2 = decimalPart2.length;
if (decimalLength1 !== decimalLength2) {
if (decimalLength1 > decimalLength2) {
return getCount(AmountSum, currVoucher.debitAmount, decimalLength1);
} else {
return getCount(AmountSum, currVoucher.debitAmount, decimalLength2);
}
}
}, 0);
}
//获取处理之后的和
function getCount(Sum, item, length) {
Sum = Sum * Math.pow(10, length);
item = item * Math.pow(10, length);
return (Sum + item) / Math.pow(10, length)
}
@ version 2.0
优化1:
let tempPow = Math.pow(10, decimalLength1);
if (decimalLength2 > decimalLength1) {
tempPow = Math.pow(10, decimalLength2);
}
AmountSum = AmountSum * tempPow;
tempDcValue = tempDcValue * tempPow;
return (AmountSum + tempDcValue) / tempPow;