乐趣区

关于javascript:最全JS浮点数加减乘除浮点数保留有效位数

留神项

  • 所有含浮点数的裸加减乘除都有可能触发精度问题;如 0.1+0.2;4100.065 * 100

具体实现

1. 乘法:

function mul(a,b){
    let c = 0,
          d = a.toString(),
          e = b.toString();
    try {c += d.split(".")[1].length;
    } catch (f) {}
    try {c += e.split(".")[1].length;
    } catch (f) {}
    return Number(d.replace(".", "")) * Number(e.replace(".","")) / Math.pow(10, c);  
}

2. 加法

function add(a,b){
    let c, d, e;
    try {c = a.toString().split(".")[1].length;
    } catch (f) {c = 0;}
    try {d = b.toString().split(".")[1].length;
    } catch (f) {d = 0;}
    e = Math.pow(10, Math.max(c, d));
    return  (mul(a, e) + mul(b, e)) / e;
}

3. 减法

function sub(a, b) {
    let c, d, e;
    try {c = a.toString().split(".")[1].length;
    } catch (f) {c = 0;}
    try {d = b.toString().split(".")[1].length;
    } catch (f) {d = 0;}
    e = Math.pow(10, Math.max(c, d));
    return (mul(a, e) - mul(b, e)) / e;
}

4. 除法

function divide(a, b) {
    var c, d, e = 0,
           f = 0;
    try {e = a.toString().split(".")[1].length;
    } catch (g) {e = 0;}
    try {f = b.toString().split(".")[1].length;
    } catch (g) {f = 0;}
    c = Number(a.toString().replace(".", ""));
    d = Number(b.toString().replace(".", ""));
    return mul(c / d, Math.pow(10, f - e));
}

5. 浮点数四舍五入, 保留固定小数位 (不加入运算,纯展现)

function round(num, precision) {const base = Math.pow(10, precision)
  return (Math.round((num.toPrecision(17) * base).toFixed(1)) / base).toFixed(precision)
}

todo 升级版

  1. 思考写成科里化模式 待做
  2. 思考大数状况 待做
退出移动版