JS 小数相加损失精度
问题:
console.log(0.1+0.2);//0.30000000000000004
console.log(0.1+0.7);//0.7999999999999999
解决思路:
- 将小数转化为整数,进行整数相加
- 将相加结果重新变为小数
出现原因:
参考 - 小数转化为二进制
有些小数并不能通过二进制完整的表示出来,比如0.1,转化为二进制后就是0.000110011...
是一个无限循环小数。并没有一个精确的二进制表示。
这样的小数在参与运算的时候会有一定的舍入操作,得到的结果自然就不是精确的。
其它语言中也有类似的情况出现
实现:
// 解决问题:小数相加损失精度 解决办法:变成整数之后相加再回退小数位
function add () {
let len = arguments.length,
maxPlace = 0;
for (let i=0; i<len; i++) {
let current = arguments[i].toString();
if (current.indexOf('.') !==-1) {
maxPlace = current.split('.')[1].length > maxPlace ? current.split('.')[1].length : maxPlace;
}
}
let power = Math.pow(10, maxPlace);
let sum = 0;
for (let i=0; i<len; i++) {
sum += arguments[i]*power;
}
return sum/power;
}
console.log('0.1+0.2', 0.1 + 0.2);
console.log('add', add(0.1 , 0.2));