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

问题描述

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

分析可能的原因

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

解决

//获取小数位数
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
}

常见应用

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

其他推荐

如何解决JavaScript中0.1+0.2不等于0.3

转载于:https://my.oschina.net/yxmBetter/blog/1797602

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值