浮点数运算会出现精度问题,主要原因是浮点数二进制运算时尾数合并后会出现溢出,然后要进行舍入,设计到源码、反码、补码的运算,这里就不赘述了,想了解可以看
JavaScript 浮点数精度之谜
这里贴出对浮点数运算解决代码,主要思路是转换成字符串运算
//浮点数运算,目前支持加减乘
function resolveFloat(base, increment, operator = '+') {
if(Array.isArray(base)){
operator = increment;
return base.reduce((first, second) => {
return resolveFloat(first, second, operator);
});
} else {
//转换成字符串
base = '' + base;
increment = '' + increment;
//计算小数点移动位数
let dig = base.split('.')[1] && base.split('.')[1].length || 0;
let dig2 = increment.split('.')[1] && increment.split('.')[1].length || 0;
let max = Math.max(dig, dig2);
let diff = dig - dig2;
//位数补全
base = base.replace('.', '');
increment = increment.replace('.', '');
if (diff >= 0) {
let cm = Math.pow(10, diff);
increment = Number(increment) * cm;
} else {
let cm = Math.pow(10, -diff);
base = Number(base) * cm;
}
switch(operator) {
case '+':
base = (+base) + (+increment);
return base/Math.pow(10, max);
case '-':
base = (+base) - (+increment);
return base/Math.pow(10, max);
case '*':
base = (+base) * (+increment);
return base/Math.pow(10, dig+dig2);
default: throw new Error("unexpected operator");
}
}
}