数值、金额类精度丢失问题

问题描述

  • 在日常项目中金额等涉及到数值计算的问题,经常会出现在加减乘除后数值精度丢失的问题

分析可能的原因

  • 十进制数的二进制表示形式可能不精确。
  • 使用的数字之间类型不匹配(例如,混合使用浮点型和双精度型)。

解决

//获取小数位数
decNum(a){
   let r = 0
    a = a.toString()
    if(a.indexOf(".") !== -1){
        r = a.split(".")[1].length
    }
    return r
},
//type:加减乘除
calc(a,b,type){
    let r = 0
    let da = this.decNum(a)
    let db = this.decNum(b)
    let dsum = da + db
    let dmin = Math.min(da,db)
    let dmax = Math.max(da,db)
    dsum += dmax - dmin
    dsum = Math.pow(10,dsum)
    dmax = Math.pow(10,dmax)
    a = parseInt(a,toString().replace(".",""))
    b = parseInt(b,toString().replace(".",""))
    if(da > db){
        b *= Math.pow(10,da-db)
    }else {
        a *= Math.pow(10,db-da)
    }
    switch(type){
        case "add":
            r = (a + b) / dmax
            break
         case "subtract":
            r = (a - b) / dmax
            break
         case "multiply":
            r = (a * b) / dsum
            break
         case "divide":
            r = a / b
            break
    }
    return r
}

常见应用

  • 项目中涉及到金额的浮点数数值类型的等会使用

猜你喜欢

转载自my.oschina.net/yxmBetter/blog/1797602