分别封装精确运算的加减乘除四个方法
/**
* 精确加法
* @param {number|string} arg1
* @param {number|string} arg2
* @returns {number}
*/
function accurateAdd(arg1, arg2) {
let r1, r2, m;
try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
m = Math.pow(10, Math.max(r1, r2))
return (arg1 * m + arg2 * m) / m
}
/**
* 精确减法
* @param {number|string} arg1
* @param {number|string} arg2
* @returns {number}
*/
function accurateSub(arg1, arg2) {
let r1, r2, m, n;
try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
m = Math.pow(10, Math.max(r1, r2));
//动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
}
/**
* 精确乘法
* @param {number|string} arg1
* @param {number|string} arg2
* @returns {number}
*/
function accurateMul(arg1, arg2) {
let m = 0, s1 = arg1.toString(), s2 = arg2.toString();
try { m += s1.split(".")[1].length } catch (e) { }
try { m += s2.split(".")[1].length } catch (e) { }
return (Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) / Math.pow(10, m)
}
/**
* 精确除法
* @param {number|string} arg1
* @param {number|string} arg2
* @returns {number}
*/
function accurateDiv(arg1, arg2) {
let s1 = arg1.toString(), s2 = arg2.toString();
let t1 = 0, t2 = 0, r1, r2;
try { t1 = s1.split(".")[1].length } catch (e) { }
try { t2 = s2.split(".")[1].length } catch (e) { }
r1 = Number(s1.replace(".", ""))
r2 = Number(s2.replace(".", ""))
return (r1 / r2) * Math.pow(10, t2 - t1);
}
// Examples
console.log(accurateAdd(0.1, 0.2)); // 0.3
console.log(accurateSub(0.3, 0.2)); // 0.1
console.log(accurateMul(0.1, 0.2)); // 0.02
console.log(accurateDiv(0.3, 0.1)); // 3
console.log(accurateAdd(100, "200")); // 300
console.log(accurateSub("1000", 200)); // 800
console.log(accurateMul("10.2", 0.2)); // 2.04
console.log(accurateDiv("0.6", "0.2")); // 3
These functions handle string and number inputs and address potential errors when dealing with decimals. They use the toFixed()
method in the subtraction function to handle potential floating-point inaccuracies and maintain precision. They also include example usage. These functions offer a more robust approach to accurate calculations in JavaScript for front-end development.