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) {
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));
console.log(Math.add(306.85, 18.05))
console.log(Math.add(306.85, 18.05).toFixed(2))