JS解决小数进行运算精度丢失问题

解决思路: 把需要进行计算的小数转成整数进行计算,然后在变成小数
function floatCalc(a, b) {
    a = a + '', b = b + '';
    var aNum = a.indexOf('.'),
        bNum = b.indexOf('.'),
        aSum,
        bSum,
        resultNum,
        inta,
        intb;

    aSum = aNum < 0 ? 0 : a.split('.')[1].length;
    bSum = bNum < 0 ? 0 : b.split('.')[1].length;
    resultNum = aSum > bSum ? aSum : bSum;

    inta = aNum < 0 ? Number(a + (Math.pow(10, resultNum) + '').replace('1', '')) : (function () {
        a = a.replace('.', '');
        a = resultNum == aSum ? a : a + (Math.pow(10, resultNum - aSum) + '').replace('1', '');
        return Number(a);
    }());

    intb = bNum < 0 ? Number(b + (Math.pow(10, resultNum) + '').replace('1', '')) : (function () {
        b = b.replace('.', '');
        b = resultNum == bSum ? b : b + (Math.pow(10, resultNum - bSum) + '').replace('1', '');
        return Number(b);
    }());
    return {
        a: inta,
        b: intb,
        num: resultNum
    }
}
//加法
Number.prototype.add = function (n) {
    var o = floatCalc(this, n);
    return (o.a + o.b) / Math.pow(10, o.num);
};
//减法
Number.prototype.minus = function (n) {
    var o = floatCalc(this, n);
    return (o.a - o.b) / Math.pow(10, o.num);
};
//乘法
Number.prototype.subtract = function (n) {
    var o = floatCalc(this, n);
    return (o.a * o.b) / Math.pow(10, o.num * 2);
};
//除法
Number.prototype.divide = function (n) {
    var o = floatCalc(this, n);
    return (o.a / o.b);
};

注意:Number类型的整数直接调用原型上的方法会报错,引擎不能区分是小数点还是调用方法的点,多写一个点或者加空格

5 .add(3.54);

ES2015/ES6 的语法来对 Number进行扩展,不污染全局

class SuperNumber extends Number {
    add(n) {
        var o = floatCalc(this,n);
        return (o.a + o.b) / Math.pow(10, o.num);
    };
    subtract(n) {
        var o = floatCalc(this, n);
        return (o.a * o.b) / Math.pow(10, o.num * 2);
    };
    minus(n) {
        var o = floatCalc(this, n);
        return (o.a - o.b) / Math.pow(10, o.num);
    }
}
  

let sum = new SuperNumber(5);sum.add(4);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值