js数值计算精度问题解决方案 同时支持TypeScript

几乎所有常见的编程语言,我们都会碰到一种情况,那就是浮点类型的数值进行计算后的结果和预期的不一样

比如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


  • 标签
  • 相关文章
  • 发表评论
当前用户:
  • 评论列表