js浮点数运算的坑 加減乘除結果 和計算器 結果不一致?

例如:

计算器结果:17.7*0.75 = 13.275

而控制台JS计算结果为: 17.7*0.75  =  13.274999999999999

这究竟是啥原因?
1,首先要肯定的是这不是浏览器的问题,而是由于浮点数的精度导致的。
2,浮点数的精度问题并不是JavaScript所独有的,例如在java中,我们运行以下代码,同样会输出和JavaScript中一样的结果。

因为电脑永远都是按照二进制进行运算的,我们输入的十进制数在转化为二进制数时,并不总如人意,意思是说有些十进制并不能用准确的二进制数表示。

比如十进制的1.1,在用二进制表示的时因为存在二进制位无限循环的表示,实际值为1.0999999999...无限接近与1.1

解决方案

常用的一种解决方法就是将浮点数转化为整数进行运算,以下是一些封装好的关于浮点运算的方法,而且经过测试,加减乘除运算都会达到自己想要的结果。

 //求和
 function add(num1,num2){
     var r1,r2,m;
     try{
         r1 = num1.toString().split(‘.‘)[1].length;
     }catch(e){
         r1 = 0
     }
     try{
         r2 = num2.toString().split(‘.‘)[1].length;
     }catch(e){
         r2 = 0
     }
     m = Math.pow(10,Math.max(r1,r2));
     return Math.round(num1*m + num2*m)/m;
 }
//相减
 function sub(num1,num2){
     var r1,r2,m;
    try{
        r1 = num1.toString().split(‘.‘)[1].length;
    }catch(e){
        r1 = 0;
    }
    try{
        r2 = num1.toString().split(‘.‘)[1].length;
    }catch(e){
        r2 = 0;
    }
    m = Math.pow(10,Math.max(r1,r2));
    n = (r1 >= r2) ? r1 : r2;
    return (Math.round(num1 * m - num2*m) / m).toFixed(n);
 }
//相乘
 function mul(num1,num2){
     var m = 0,r1,r2;
     var s1 = num1.toString();
     var s2 = num2.toString();
     try{
         m += s1.split(‘.‘)[1].length
     }catch(e){
 
     }
     try{}catch(e){
         m += s2.split(‘.‘)[1].length
     }catch(e){
 
     }
     r1 = Number(num1.toString().replace(".",""));
     r2 = Number(num2.toString().replace(".",""));
     return r1 * r2 / Math.pow(10,m);
 }
 //相除
 function accDiv(){
      var t1,t2,r1,r2;
     try{
         t1 = num1.toString().split(‘.‘)[1].length;
     }catch(e){
         t1 = 0;
     }
     try{}catch(e){
         t2 = num2.toString().split(‘.‘)[1].length;
     }catch(e){
         t2 = 0;
     }
     r1 = Number(num1.toString().replace(".",""));
     r2 = Number(num2.toString().replace(".",""));
     return (r1 / r2)*Math.pwo(10,t2-t1);
 }

转载自: https://www.bbsmax.com/A/kvJ3Lg0p5g/

js浮点数运算的坑 加減乘除結果 和計算器 結果不一致?

上一篇:JS,JQuery获取当前屏幕宽度


下一篇:关于云服务器中IE浏览器无法下载和登录网站的问题解决方案