js乘法精度计算代码 求解释

JavaScript021

js乘法精度计算代码 求解释,第1张

try只是捕获错误,被try包围的语句如果出错了也会继续执行下面的。

这里try里面的语句是获取小数位的长度,假如s1是整数的话s1.split(".")[1].length这句会出错。所以忽略这句,继续执行下面的。

如果不用try的话可以改成下面的

function accMul(arg1, arg2) {

    var m = 0,

        s1 = arg1.toString(),

        s2 = arg2.toString(),

        t

    t = s1.split(".")

    // 判断有没有小数位,避免出错

    if (t[1]) {

        m += t[1].length

    }

    t = s2.split(".")

    if (t[1]) {

        m += t[1].length

    }

    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)

}

js含有小数的计算都会有丢失精度的问题

实际上解决的办法就是

把小数转化为整数计算 并同时记住扩大的倍数

最后把结果缩小这个倍数 得到不丢失精度的结果

try catch 就是捕获异常 如果没有捕获肯定会报错

也就是你现在按流程所设想的

但是catch(e){}  是捕获了异常 但是里面并没有任何操作

也就是 越过去了 忽略掉

// 这句就是像将小数点去掉 变成整数 如果没有小数点那就没有变化

// 然后计算之后 缩小 10的m次方倍  也就是之前扩大了的倍数

Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)

// 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

    }

}()