js 加减乘除精度修复 2020-12-09

JavaScript027

js 加减乘除精度修复 2020-12-09,第1张

// js小数加减乘除时精度修正

export const floatObj = function () {

    //加法

    function add(a,b){

        return math.number(math.add(math.bignumber(a), math.bignumber(b))) 

    }

    //减法

    function subtract(a,b){

        return math.number(math.subtract(math.bignumber(a), math.bignumber(b)))

    }

    // 乘法

    function multiply(a,b){

        return  math.number(math.multiply(math.bignumber(a), math.bignumber(b)))

    }

    // 除法

    function divide(a,b){

        let num

        a==0||b==0? num = 0 : num = math.number(math.divide(math.bignumber(a), math.bignumber(b)))

        return  num

    }

    //四舍五入并保留n位小数(isRound是否四舍五入)

    function fomatFloat(num,n,isRound){   

        var f = parseFloat(num)

        if(isNaN(f)){

            return false

        }   

        f = Math.round(num*Math.pow(10, isRound?n:n+1))/Math.pow(10, isRound?n:n+1) // n 幂   

        var s = f.toString()

        var rs = s.indexOf('.')

        //判定如果是整数,增加小数点再补0

        if(rs < 0){

            rs = s.length

            s += '.' 

        }

        while(s.length <= rs + n){

            s += '0'

        }

        let _s = s.split(".")[0] + '.' + (s.split(".")[1].substr(0,n))        

        return Number(isRound?s:_s)

    }    

    return {

    add: add,

    subtract: subtract,

    multiply: multiply,

    divide: divide,

    fomatFloat

    }

}()

如:0.1+0.2 !== 0.3;0.1*0.2 !== 0.03

如:9999999999999999 === 10000000000000001

如:1.335.toFixed(2) // 1.33;1.336.toFixed(2) // 1.34

二进制模仿十进制进行四舍五入,而二进制只有0和1,于是就0舍1入,于是就导致了小数计算不精确。大数的精度丢失本质上是和小数一样,js中表示最大的数是Math.pow(2, 53),十进制即 9007199254740992;大于该数的值可能会丢失精度。

小数的话,一般转成整数进行计算,然后对结果做除法;同样也可以直接对结果进行4舍5入;

对于大数出现的问题概率较低,毕竟还要运算结果不超过最大数就不会丢失精度;

javaScript数字精度丢失问题总结

js中精度问题以及解决方案

JavaScript 中精度问题以及解决方案