几乎所有常见的编程语言,我们都会碰到一种情况,那就是浮点类型的数值进行计算后的结果和预期的不一样。
比如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