美文网首页
js 小数点精度问题 加减乘除

js 小数点精度问题 加减乘除

作者: 饱饱想要灵感 | 来源:发表于2022-09-25 21:07 被阅读0次
    1. 加法

    思路:
    计算出小数点后更多的位数N, 做10的N次方,
    两个加数各自乘以10的N次方再相加,
    然后除以10的N次方

    比如 3.14 + 3.1, 则过程为:

    • 更多的位数2, 做10的2次方等于100,
    • 3.14*100 + 3.1*100 = 624
    • 624 / 100 = 6.24
    function accAdd(arg1,arg2){  
      var r1, r2, m;  
      try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}  
      try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}  
    
      m=Math.pow(10,Math.max(r1,r2))  
      return (arg1*m + arg2*m) / m  
    }  
    
    1. 减法

    思路:
    计算出小数点后更多的位数N, 做10的N次方,
    两个加数各自乘以10的N次方再相减,
    然后除以10的N次方
    最后转换成转换成更多的位数toFixed(N)

    比如 3.14 - 3.1, 则过程为:

    • 更多的位数2, 做10的2次方等于100,
    • 3.14*100 - 3.1*100 = 4
    • 4 / 100 = 0.04
    function Subtr(arg1,arg2){ 
      var r1, r2, m, n; 
      try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} 
      try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} 
    
      m=Math.pow(10, Math.max(r1,r2)); 
      n=(r1 >= r2)?r1:r2; 
      return ((arg1*m-arg2*m)/m).toFixed(n); 
    }
    
    1. 乘法

    思路:
    两个乘数小数点之后位数相加得到N, 做10的N次方
    两个乘数直接去掉小数点, 然后相乘
    最后除以10的N次方

    比如 3.14 * 3.1, 则过程为:

    • 小数点之后位数相加得3, 做10的3次方1000,
    • 314 * 31 = 9734
    • 9734 / 1000 = 9.734
     function accMul(arg1,arg2)  
     {  
     var m=0,s1=arg1.toString(),s2=arg2.toString();  
     try{m+=s1.split(".")[1].length}catch(e){}  
     try{m+=s2.split(".")[1].length}catch(e){}  
     return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)  
     }  
    
    1. 除法

    思路:
    两个除数直接去掉小数点相除, 得M
    除数的小数点位数减去被除数的小数点位数, 做10的N次方
    然后, 用 M 乘以 10的N次方(复用上面乘法的实现)

    比如 3.14 / 3.1, 则过程为:

    • 直接去掉小数点相除 314 / 31 = 10.129,
    • 除数的小数点位数1, 减去被除数的小数点位数2, 得 -1, 做10的-1次方得0.1
    • 然后复用乘法的逻辑, 计算 10.129 * 0.1
    • 小数点之后位数相加得4, 做10的4次方10000,
    • 10129 * 1 = 10129
    • 10129/ 10000 = 1.0129
    function accDiv(arg1,arg2){  
     var t1=0,t2=0,r1,r2;  
     try{t1=arg1.toString().split(".")[1].length}catch(e){}  
     try{t2=arg2.toString().split(".")[1].length}catch(e){}  
     with(Math){  
     r1=Number(arg1.toString().replace(".",""))  
     r2=Number(arg2.toString().replace(".","")) 
     return accMul((r1/r2),pow(10,t2-t1));  
     }  
     } 
    

    相关文章

      网友评论

          本文标题:js 小数点精度问题 加减乘除

          本文链接:https://www.haomeiwen.com/subject/kamywrtx.html