js计算丢失精度问题

JS 丢失精度的问题在网上一搜一大片,所以我就找了一个使用

Number.prototype.mul = function (a) {
    var b = 0, c = this.toString(), d = a.toString();
    try { b += c.split(".")[1].length } catch (e) {}
    try { b += d.split(".")[1].length } catch (e) {}
    return Number(c.replace(".", "")) * Number(d.replace(".", "")) / Math.pow(10, b)
}, Number.prototype.divide = function (a) {
    var d, e, b = 0, c = 0;
    try { b = this.toString().split(".")[1].length } catch (f) {}
    try { c = a.toString().split(".")[1].length } catch (f) {}
    return d = Number(this.toString().replace(".", "")), e = Number(a.toString().replace(".", "")), d / e * Math.pow(10, c - b)
}, Number.prototype.add = function (a) {
    var b, c, d;
    try { b = a.toString().split(".")[1].length } catch (e) { b = 0 }
    try { c = this.toString().split(".")[1].length } catch (e) { c = 0 }
    return d = Math.pow(10, Math.max(b, c)), (a * d + this * d) / d
}, Number.prototype.subtract = function (a) {
    var b, c, d, e;
    try { b = this.toString().split(".")[1].length } catch (f) { b = 0 }
    try { c = a.toString().split(".")[1].length } catch (f) { c = 0 }
    return d = Math.pow(10, Math.max(b, c)), e = b >= c ? b : c, Number(((this * d - a * d) / d).toFixed(e))
};

在这个代码中 add和subtract方法 在返回操作时仍然使用的浮点计算的,所以依然会出现精度丢失的情况。

add方法

return d = Math.pow(10, Math.max(b, c)), (a * d + this * d) / d

这个记的地方应该是改为 return d = Math.pow(10, Math.max(b, c)), (a.mul(d) + this.mul(d)) / d

同样subtract这个地方也存在同样的问题。

修改后的全部代码为

Number.prototype.mul = function (a) {
    var b = 0, c = this.toString(), d = a.toString();
    try { b += c.split(".")[1].length } catch (e) {}
    try { b += d.split(".")[1].length } catch (e) {}
    return Number(c.replace(".", "")) * Number(d.replace(".", "")) / Math.pow(10, b)
}, Number.prototype.divide = function (a) {
    var d, e, b = 0, c = 0;
    try { b = this.toString().split(".")[1].length } catch (f) {}
    try { c = a.toString().split(".")[1].length } catch (f) {}
    return d = Number(this.toString().replace(".", "")), e = Number(a.toString().replace(".", "")), d / e * Math.pow(10, c - b)
}, Number.prototype.add = function (a) {
    var b, c, d;
    try { b = a.toString().split(".")[1].length } catch (e) { b = 0 }
    try { c = this.toString().split(".")[1].length } catch (e) { c = 0 }
    return d = Math.pow(10, Math.max(b, c)), (a.mul(d) + this.mul(d)) / d
}, Number.prototype.subtract = function (a) {
    var b, c, d, e;
    try { b = this.toString().split(".")[1].length } catch (f) { b = 0 }
    try { c = a.toString().split(".")[1].length } catch (f) { c = 0 }
    return d = Math.pow(10, Math.max(b, c)), e = b >= c ? b : c, Number(((this.mul(d) - a.mul(d)) / d).toFixed(e))
};

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。