由于计算机是用二进制来存储和处理文字,不能精确表示浮点数,而javascirt中没有相应的封装类来处理浮点型运算,直接运算,会出现精度丢失的问题。
为了解决这个问题,需找出参数中最大精度,参数都变成整数去计算。具体实现方法,参考如下。
/**
* 计算,处理精确度丢失
* @param {Number} arg1 参数1
* @param {Number} arg2 参数2
* @param {String} operator 运算符
* @param {String} accuracy 保留小数精度
*/
```
export function calculationRender(arg1, arg2, operator, accuracy) {
if (operator === '/' && arg2 === 0) return;
if (typeof arg1 === 'number' && typeof arg2 === 'number') {
const precision1 = arg1.toString().split('.')[1] ? arg1.toString().split('.')[1].length : 0;
const precision2 = arg2.toString().split('.')[1] ? arg2.toString().split('.')[1].length : 0;
let maxPrecision = Math.max(precision1, precision2);
const precision = precision1 >= precision2 ? precision1 : precision2;
maxPrecision = 10 ** maxPrecision;
let result;
switch (operator) {
case '+':
result = (arg1 * maxPrecision + arg2 * maxPrecision) / maxPrecision;
break;
case '-':
result = ((arg1 * maxPrecision - arg2 * maxPrecision) / maxPrecision).toFixed(precision);
break;
case '*':
result =
(Number(arg1.toString().replace('.', '')) * Number(arg2.toString().replace('.', ''))) /
10 ** (precision1 + precision2);
break;
case '/':
result =
(Number(arg1.toString().replace('.', '')) / Number(arg2.toString().replace('.', ''))) *
10 ** (precision2 - precision1);
break;
default:
break;
}
if (accuracy || accuracy === 0) {
if (
result &&
result.toString().split('.')[1] &&
result.toString().split('.')[1].length > accuracy
)
result = result.toFixed(accuracy);
}
return result;
}
}
```