1. 程式人生 > >黃聰:JS數學計算精度修正

黃聰:JS數學計算精度修正

function 浮點數 turn 計算 filesize add follow fun his

問題描述

如果我問你,4330.61乘以100等於多少,我猜你肯定跟我說:“肯定是 433061”啊!
是啊,要我我也是這麽回答,來來來我們來看看瀏覽器怎麽說吧,如下圖

技術分享圖片 瀏覽器告訴我,他就是算不對
偌!瀏覽器告訴我,他就是算不對,這要是給客戶算錢,客戶不就有意見了....
WHY?計算機計算出來的還不如我自己的心算呢!!!!
如果你想了解什麽原因,您請看=>js浮點數精度問題的前世今生?

解決辦法

;(function(){
  function mathService(){
    this.add=function(a,b){
      var c, d, e;
      try {
        c = a.toString().split(".")[1].length;
      } catch (f) {
        c = 0;
      }
      try {
        d = b.toString().split(".")[1].length;
      } catch (f) {
        d = 0;
      }
      return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) + this.mul(b, e)) / e;
   }

   this.mul=function(a, b) {
      var c = 0,
        d = a.toString(),
        e = b.toString();
      try {
        c += d.split(".")[1].length;
      } catch (f) {}
      try {
        c += e.split(".")[1].length;
      } catch (f) {}
      return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
    }

   this.sub=function(a,b){
     var c, d, e;
     try {
       c = a.toString().split(".")[1].length;
     } catch (f) {
       c = 0;
     }
     try {
       d = b.toString().split(".")[1].length;
     } catch (f) {
       d = 0;
     }
     return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) - this.mul(b, e)) / e;
   }

   this.div=function(a, b) {
     var c, d, e = 0,
       f = 0;
     try {
       e = a.toString().split(".")[1].length;
     } catch (g) {}
     try {
       f = b.toString().split(".")[1].length;
     } catch (g) {}
     return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), this.mul(c / d, Math.pow(10, f - e));
   }
  }

  window.mathService=new mathService()

})(window);

來來來,用起來

技術分享圖片 image.png

Ok!寫完收工!!!



作者:小楓學幽默
鏈接:https://www.jianshu.com/p/c3374517b976
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。

黃聰:JS數學計算精度修正