留神项
- 所有含浮点数的裸加减乘除都有可能触发精度问题;如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 升级版
- 思考写成科里化模式 待做
- 思考大数状况 待做