js小数运算出现的问题(精度丢失)及解决办法

案例:

项目中遇到的问题

购物车结算时,商品价格(33.01)-优惠券价格(5),本应该是28.01,但是实际的结果是28.009999999999998

本案例是在浏览器控制台里打印

 出现的原因:原因其实就是js number类型运算都需要先将十进制转二进制
但小数点后的位数转二进制会出现无限循环的问题,只能舍0入1,所以会出现小数点丢失问题

 

解决方法:

1.保留小数位数toFixed()

 注意:toFixed()保留完是字符串,需要转数字类型

 

2.可以通过先乘10的倍数,然后再除
比如 我要保留两位小数 那我就乘100,运算完后再除100

 虽然繁琐,但是有效

封装成方法

//num1 num2传入两个值  symbol +-*/符号
function amend(num1,num2,symbol){
  var str1=num1.toString(),str2=num2.toString(),result,str1Length,str2Length
    //解决整数没有小数点方法
    try {str1Length= str1.split('.')[1].length} catch (error) {str1Length=0}
    try {str2Length= str2.split('.')[1].length} catch (error) {str2Length=0}
    var step=Math.pow(10,Math.max(str1Length,str2Length))
    // 
    console.log(step);
    switch (symbol) {
        case "+":
            result= (num1*step+num2*step)/step
            break;
        case "-":
            result= (num1*step-num2*step)/step
            break;
        case "*":
            result= ((num1*step)*(num2*step)) / step/step
            break;
        case "/":
            result= (num1*step)/(num2*step)
            break;
        default:
            break;
    }
    return result
    
}
console.log(amend(0.1,0.2,"+"));

 

相关的第三方库:bignumber.js   decimal.js    math.js 等

posted @ 2023-05-12 16:12  青幽草  阅读(1669)  评论(0编辑  收藏  举报