最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年07月09日 11:13:31   作者:zhang070514  
這篇文章主要介紹了JavaScript解決浮點數(shù)計算不準確問題的方法,結(jié)合實例形式分析了javascript浮點數(shù)運算精度誤差的原因以及相關(guān)的解決方法與具體操作技巧,需要的朋友可以參考下

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

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

0.1+0.2=?

輸出結(jié)果是:0.30000000000000004。

為什么會這樣呢?

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

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

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

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

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

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

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

/*判斷obj是否為一個整數(shù)*/
function isInteger(obj){
  return Math.floor(obj) === obj;
}
/**
* 將一個浮點數(shù)轉(zhuǎn)換成整數(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ù)轉(zhuǎn)化為整數(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;
  }
}

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

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

相關(guān)文章

  • javascript單例模式的簡單實現(xiàn)方法

    javascript單例模式的簡單實現(xiàn)方法

    這篇文章主要介紹了javascript單例模式的簡單實現(xiàn)方法,以javascript創(chuàng)建唯一實例的形式分析了javascript單例模式的簡單實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • JavaScript數(shù)據(jù)分析之交集,并集,對稱差集

    JavaScript數(shù)據(jù)分析之交集,并集,對稱差集

    這篇文章主要介紹了JavaScript數(shù)據(jù)分析之交集,并集,對稱差集,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • 獲取當前點擊按鈕的id用this.id實現(xiàn)

    獲取當前點擊按鈕的id用this.id實現(xiàn)

    這篇文章主要介紹了獲取當前點擊按鈕的id的方法,,需要的朋友可以參考下
    2014-03-03
  • bootstrap Table服務(wù)端處理分頁(后臺是.net)

    bootstrap Table服務(wù)端處理分頁(后臺是.net)

    這篇文章主要為大家詳細介紹了bootstrap Table服務(wù)端處理分頁,后臺是.net,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Zepto實現(xiàn)密碼的隱藏/顯示

    Zepto實現(xiàn)密碼的隱藏/顯示

    本文主要介紹了js中隱藏/顯示密碼的Zepto的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • window.print()前端實現(xiàn)網(wǎng)頁打印功能詳解

    window.print()前端實現(xiàn)網(wǎng)頁打印功能詳解

    JavaScript 函數(shù)window.print()可用于打印你的應(yīng)用的內(nèi)容,但是它針對的是使用默認打印體驗打印顯示在屏幕上的內(nèi)容,這篇文章主要給大家介紹了關(guān)于window.print()前端實現(xiàn)網(wǎng)頁打印功能的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • 一文詳解如何用原型鏈的方式實現(xiàn)JS繼承

    一文詳解如何用原型鏈的方式實現(xiàn)JS繼承

    JavaScript中,每當創(chuàng)建一個對象,都會給這個對象提供一個內(nèi)置對象 [[Prototype]] 。這個對象就是原型對象,[[Prototype]] 的層層嵌套就形成了原型鏈。本文將詳細講解如何用原型鏈的方式實現(xiàn)一個 JS 繼承,感興趣的可以了解下
    2022-04-04
  • JavaScript實現(xiàn)給對象添加一個只讀屬性

    JavaScript實現(xiàn)給對象添加一個只讀屬性

    這篇文章主要為大家介紹了JavaScript如何給對象加一個只讀屬性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 使用?Angular?服務(wù)器端渲染?Transfer?State?Service

    使用?Angular?服務(wù)器端渲染?Transfer?State?Service

    這篇文章主要介紹了使用?Angular?服務(wù)器端渲染?Transfer?State?Service,假設(shè)我們使用?Angular?Universal?開發(fā)一個服務(wù)器端渲染的?Angular?應(yīng)用,這個應(yīng)用會消費一個第三方的?Restful?API
    2022-06-06
  • 微信小程序?qū)崿F(xiàn)列表頁的點贊和取消點贊功能

    微信小程序?qū)崿F(xiàn)列表頁的點贊和取消點贊功能

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)列表頁的點贊和取消點贊功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11

最新評論

武冈市| 天气| 伽师县| 哈尔滨市| 呼图壁县| 开平市| 泸水县| 山东省| 阿鲁科尔沁旗| 高雄县| 隆回县| 虞城县| 万宁市| 新泰市| 贵州省| 宁夏| 五常市| 永吉县| 左贡县| 盐亭县| 保德县| 赞皇县| 遂宁市| 云霄县| 芒康县| 兰考县| 双江| 曲阜市| 华坪县| 临邑县| 包头市| 永兴县| 宝山区| 永定县| 京山县| 和田市| 泽州县| 阜平县| 湟中县| 门头沟区| 阿拉善左旗|