问题描述
- 在日常项目中金额等涉及到数值计算的问题,经常会出现在加减乘除后数值精度丢失的问题
分析可能的原因
- 十进制数的二进制表示形式可能不精确。
- 使用的数字之间类型不匹配(例如,混合使用浮点型和双精度型)。
解决
//获取小数位数
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
}
常见应用