共计 1119 个字符,预计需要花费 3 分钟才能阅读完成。
留神项
- 所有含浮点数的裸加减乘除都有可能触发精度问题;如 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 升级版
- 思考写成科里化模式 待做
- 思考大数状况 待做
正文完
发表至: javascript
2020-09-01