浮点数运算

浮点数运算会出现精度问题,主要原因是浮点数二进制运算时尾数合并后会出现溢出,然后要进行舍入,设计到源码、反码、补码的运算,这里就不赘述了,想了解可以看
JavaScript 浮点数精度之谜

这里贴出对浮点数运算解决代码,主要思路是转换成字符串运算

//浮点数运算,目前支持加减乘
function resolveFloat(base, increment, operator = '+') {
    if(Array.isArray(base)){
        operator = increment;
        return base.reduce((first, second) => {
            return resolveFloat(first, second, operator);
        });
    } else {
        //转换成字符串
        base = '' + base;
        increment = '' + increment;
        //计算小数点移动位数
        let dig = base.split('.')[1] && base.split('.')[1].length || 0;
        let dig2 = increment.split('.')[1] && increment.split('.')[1].length || 0;
        let max = Math.max(dig, dig2);
        let diff = dig - dig2;
        //位数补全
        base = base.replace('.', '');
        increment = increment.replace('.', '');
        if (diff >= 0) {
            let cm = Math.pow(10, diff);
            increment = Number(increment) * cm;
        } else {
            let cm = Math.pow(10, -diff);
            base = Number(base) * cm;
        }
        switch(operator) {
            case '+':
                base = (+base) + (+increment);
                return base/Math.pow(10, max);
            case '-':
                base = (+base) - (+increment);
                return base/Math.pow(10, max);
            case '*':
                base = (+base) * (+increment);
                return base/Math.pow(10, dig+dig2);
            default: throw new Error("unexpected operator");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值