分别封装精确运算的加减乘除四个方法

/**
 * 精确加法
 * @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.

posted @ 2024-11-24 18:04  王铁柱6  阅读(30)  评论(0)    收藏  举报