几乎所有常见的编程语言,我们都会碰到一种情况,那就是浮点类型的数值进行计算后的结果和预期的不一样。
比如js里计算0.1+0.2,最终结果会是0.30000000000000004
其中原理我就不BB(ctrl+c、ctrl+v)了,直接上同时支持js和ts的解决方法。
// 加 Number.prototype['add'] = function (...arg) { var r1, r2, m, result = this; arg.forEach(value => { try { r1 = result.toString().split(".")[1].length } catch (e) { r1 = 0 } try { r2 = value.toString().split(".")[1].length } catch (e) { r2 = 0 } m = Math.pow(10, Math.max(r1, r2)); result = Math.round(result * m + value * m) / m; }); return result; }; // 减 Number.prototype['sub'] = function (...arg) { var r1, r2, m, result = this; arg.forEach(value => { try { r1 = result.toString().split(".")[1].length } catch (e) { r1 = 0 } try { r2 = value.toString().split(".")[1].length } catch (e) { r2 = 0 } m = Math.pow(10, Math.max(r1, r2)); var n = (r1 >= r2) ? r1 : r2; result = (Math.round(result * m - value * m) / m).toFixed(n); }); return result; }; // 乘 Number.prototype['mul'] = function (...arg) { var result = this; arg.forEach(value => { var m = 0, s1 = result.toString(), s2 = value.toString(); try { m += s1.split(".")[1].length } catch (e) { } try { m += s2.split(".")[1].length } catch (e) { } result = Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); }); return result; }; // 除 Number.prototype['div'] = function (...arg) { var result = this; arg.forEach(value => { var t1 = 0, t2 = 0, r1, r2; try { t1 = result.toString().split(".")[1].length } catch (e) { } try { t2 = value.toString().split(".")[1].length } catch (e) { } r1 = Number(result.toString().replace(".", "")); r2 = Number(value.toString().replace(".", "")); result = (r1 / r2) * Math.pow(10, t2 - t1); }); return result; };
使用方法:
// 0.1 + 0.2 console.log(0.1.add(0.2)); // 0.3 // 同时支持传入多个参与计算的数 var a = 5; // a * 2 * 3 console.log(a.mul(2, 3)); // 30