真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

JavaScript解決浮點數(shù)計算不準確問題的方法分析

本文實例講述了JavaScript解決浮點數(shù)計算不準確問題的方法。分享給大家供大家參考,具體如下:

為梓潼等地區(qū)用戶提供了全套網頁設計制作服務,及梓潼網站建設行業(yè)解決方案。主營業(yè)務為網站設計、網站制作、梓潼網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

最近在學習electron框架,想利用這個框架做一個簡單的計算器demo。當我對小數(shù)進行運算時,發(fā)現(xiàn)了一個問題。

0.1+0.2=?

輸出結果是:0.30000000000000004。

為什么會這樣呢?

其實對于浮點數(shù)的四則運算,幾乎所有的編程語言都會有類似精度誤差的問題,只不過在 C++/C#/Java 這些語言中已經封裝好了方法來避免精度的問題,而 JavaScript 是一門弱類型的語言,從設計思想上就沒有對浮點數(shù)有個嚴格的數(shù)據(jù)類型,所以精度誤差的問題就顯得格外突出。

首先我們分析一下為什么會出現(xiàn)這個精度誤差?

首先,我們要站在計算機的角度思考 0.1 + 0.2 這個看似小兒科的問題。我們知道,能被計算機讀懂的是二進制,而不是十進制,所以我們先把 0.1 和 0.2 轉換成二進制看看:

0.1 => 0.0001 1001 1001 1001..(無限循環(huán))
0.2 => 0.0011 0011 0011 0011…(無限循環(huán))

上面我們發(fā)現(xiàn)0.1和0.2轉化為二進制之后,變成了一個無限循環(huán)的數(shù)字,這在現(xiàn)實生活中,無限循環(huán)我們可以理解,但計算機是不允許無限循環(huán)的,對于無限循環(huán)的小數(shù),計算機會進行舍入處理。進行雙精度浮點數(shù)的小數(shù)部分最多支持52位,所以兩者相加之后得到這么一串 0.0100110011001100110011001100110011001100110011001100 因浮點數(shù)小數(shù)位的限制而截斷的二進制數(shù)字,這時候,我們再把它轉換為十進制,就成了 0.30000000000000004。

知道了浮點數(shù)產生的原因,那么如何處理這個問題呢?

方法1:通過toFixed(num)方法來保留小數(shù)。因為這個方法是根據(jù)四舍五入來保留小數(shù)的,所以最后的計算結果不精確。

方法2:把要計算的數(shù)字升級(乘以10的n次冪)成計算機能夠精確識別的整數(shù),計算完以后再降級,推薦使用這一種方法。具體代碼如下(主要有3個方法):

/*判斷obj是否為一個整數(shù)*/
function isInteger(obj){
  return Math.floor(obj) === obj;
}
/**
* 將一個浮點數(shù)轉換成整數(shù),返回整數(shù)和倍數(shù)
* 如 3.14 》》314 倍數(shù)是100
*
*/
function toInteger(floatNum){
  var ret = {times:1,num:0};
  //是整數(shù)
  if(isInteger(floatNum)){
    ret.num = floatNum;
    return ret;
  }
  var strfi = floatNum + '';
  //查找小數(shù)點的下標
  var dotPos = strfi.indexOf('.');
  console.log('dotPos===='+dotPos);
  //獲取小數(shù)的位數(shù)
  var len = strfi.substr(dotPos+1).length;
  console.log('len===='+len);
  //Math.pow(10,len)指定10的len次冪。
  var time = Math.pow(10,len);
  //將浮點數(shù)轉化為整數(shù)
  var intNum = parseInt(floatNum*time + 0.5,10);
  console.log('intNum===='+intNum);
  ret.times = time;
  ret.num = intNum;
  return ret;
}
/**
*進行運算
*三個參數(shù)分別是要運算的兩個數(shù)和運算符
*/
function operation(a,b,op){
  var o1 = toInteger(a);
  var o2 = toInteger(b);
  var n1 = o1.num;
  var n2 = o2.num;
  var t1 = o1.times;
  var t2 = o2.times;
  var max = t1 > t2 ? t1 : t2;
  var result = null;
  switch(op){
    case 'add':
      if(t1 === t2){
        result = n1 + n2;
      }else if(t1 > t2){
        result = n1 + n2 * (t1/t2);
      }else{
        result = n1 * (t2/t1) + n2;
      }
      return result / max;
      break;
    case 'subtract':
      if(t1 === t2){
        result = n1 - n2;
      }else if(t1 > t2){
        result = n1 - n2 * (t1/t2);
      }else{
        result = n1 * (t2/t1) - n2;
      }
      return result / max;
      break;
    case 'multiply':
      result = (n1 * n2)/(t1 * t2);
      return result;
      break;
    case 'divide':
      result = (n1 / n2)/(t2 / t1);
      return result;
      break;
  }
}

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript數(shù)學運算用法總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript數(shù)組操作技巧總結》、《JavaScript事件相關操作與技巧大全》、《JavaScript操作DOM技巧總結》及《JavaScript字符與字符串操作技巧總結》

希望本文所述對大家JavaScript程序設計有所幫助。


新聞標題:JavaScript解決浮點數(shù)計算不準確問題的方法分析
分享路徑:http://weahome.cn/article/pdoegp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部