编辑代码

/**
 * 准确精度的数学运算
 * @example Math.add(num1,num2,...)
 * @author  ChenChiFeng
 * @date    2022/08/24 10:39
 */
let extentFns = ['add', 'sub', 'mul', 'div']; // 加减乘除

function ufunc(type, arg) {
    var decimalDigits = [];
    for (let index in arg) {
        let digit = 0;
        try {
            digit = arg[index].toString().split('.')[1].length;
        } catch (e) {
            digit = 0;
        }
        decimalDigits.push(digit);
    }
    decimalDigits.sort((a, b) => b - a);
    let maxDigit = decimalDigits[0];
    let m = Math.pow(10, maxDigit);
    let result = 0;
    switch (type) {
        case 'add':
            for (let index in arg) {
                // console.log(`第${Number(index)+1}步运算: result=${result}+${arg[index]}*${m}=${result + arg[index] * m}`)
                result += arg[index] * m;
            }
            return result / m;
            break;
        case 'sub':
            for (let index in arg) {
                if (index == 0) {
                    result = arg[index] * m - result;
                } else {
                    result -= arg[index] * m;
                }
            }
            return result / m;
            break;
        case 'mul':
            result = 1;
            for (let index in arg) {
                result *= arg[index] * m;
            }
            return result / Math.pow(m, arg.length);
            break;
        case 'div':
            result = 1;
            for (let index in arg) {
                if (index == 0) {
                    result = arg[index] * m;
                } else {
                    result = (result * m) / (arg[index] * m);
                }
            }
            return result / m;
            break;
        default:
            break;
    }
}
Math.ufunc = ufunc;

for (let i = 0; i < extentFns.length; i++) {
    Math[extentFns[i]] = function () {
        return this.ufunc(extentFns[i], arguments);
    };
}

console.log(0.1 + 0.2, Math.add(0.1, 0.2));
console.log(1.1 - 0.2, Math.sub(1.1, 0.2));
console.log(0.1 * 0.2 * 0.3, Math.mul(0.1, 0.2, 0.3));
console.log(0.001 / 0.2 / 0.5, Math.div(0.001, 0.2, 0.5));

console.log(1 + 2, Math.add(1, 2));
console.log(1 - 2, Math.sub(1, 2));
console.log(0.1 * 2 * 6, Math.mul(0.1, 2, 6));
console.log(0.1 / 0.2 / 5, Math.div(0.1, 0.2, 5));

// 这个方法还是有缺陷, 例如306.85 * 100 = 30685.000000000004
console.log(Math.add(306.85, 18.05))
// 兼容
console.log(Math.add(306.85, 18.05).toFixed(2))