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

一文解決前端JS小數(shù)運(yùn)算精度問題

 更新時(shí)間:2024年02月21日 08:18:51   作者:Katrin  
在做項(xiàng)目的時(shí)候,前端需要在表格的底部做一個(gè)匯總的功能,在采用reduce對當(dāng)前屬性所有值匯總時(shí),發(fā)現(xiàn)匯總結(jié)果存在好長的小數(shù)位,本文給大家介紹了如何解決前端JS小數(shù)運(yùn)算精度問題,需要的朋友可以參考下

前言

在做項(xiàng)目的時(shí)候,前端需要在表格的底部做一個(gè)匯總的功能,在采用reduce對當(dāng)前屬性所有值匯總時(shí),發(fā)現(xiàn)匯總結(jié)果存在好長的小數(shù)位,本以為后端的數(shù)據(jù)就存在精度這么小的數(shù)據(jù),后來,檢查發(fā)現(xiàn)后端精度只有三位小數(shù),但前端計(jì)算結(jié)果為什么會這樣呢?

JS存在精度問題

在控制臺可以試一下
0.1 + 0.2 的結(jié)果是0.30000000000000004
js的運(yùn)算下 0.1 + 0.2 != 0.3

由于計(jì)算機(jī)在存儲和計(jì)算數(shù)字的時(shí)候,使用的是二進(jìn)制形式,有些十進(jìn)制數(shù)據(jù)再轉(zhuǎn)換成二進(jìn)制時(shí),無法精確表示。

JS在數(shù)字運(yùn)算的時(shí)候,當(dāng)存在浮點(diǎn)數(shù)的運(yùn)算時(shí),就有可能會出現(xiàn)精度誤差,有些小數(shù)無法用二進(jìn)制精確表示。

JavaScript采用的是雙精度(64位)浮點(diǎn)運(yùn)算規(guī)則,遵循的是IEEE二進(jìn)制浮點(diǎn)數(shù)算法標(biāo)準(zhǔn)。其中有1位用作符號位,11位為階碼,尾數(shù)有52位。有興趣詳細(xì)了解的可以查閱相關(guān)資料。

比如
十進(jìn)制0.1 -> 二進(jìn)制表示為0.0001 1001 1001 1001...(1100循環(huán))
十進(jìn)制0.2 -> 二進(jìn)制表示為0.0011 0011 0011 0011...(0011循環(huán))
EEE 754 標(biāo)準(zhǔn)的 64 位雙精度浮點(diǎn)數(shù)的小數(shù)部分最多支持53位二進(jìn)制位,所以兩者相加之后得到二進(jìn)制為:
0.1 + 0.2 = 
0.0100110011001100110011001100110011001100110011001100 
因浮點(diǎn)數(shù)小數(shù)位的限制而截?cái)嗟亩M(jìn)制數(shù)字,再轉(zhuǎn)換為十進(jìn)制,就成了0.30000000000000004。

解決方案

思路:

  • 將小數(shù)轉(zhuǎn)化成整數(shù)進(jìn)行計(jì)算,規(guī)避浮點(diǎn)數(shù)運(yùn)算問題。
  • 整數(shù)的加減乘運(yùn)算結(jié)果不會出現(xiàn)浮點(diǎn)數(shù),不會存在精度問題,但除法會出現(xiàn)浮點(diǎn)數(shù),因此用toFixed()方法截掉無效的小數(shù)位。
  • 將string轉(zhuǎn)回number輸出
/** 封裝一個(gè)公共方法numberCalculate() 用于浮點(diǎn)數(shù)運(yùn)算 */
//num1 num2傳入兩個(gè)值 symbol +-*/符號
numberCalculate(num1: number, num2: number, symbol: string) {
    var str1 = num1.toString(), str2 = num2.toString(), result, str1Length, str2Length
    try {
        //獲取小數(shù)點(diǎn)后的精度
        str1Length = str1.split('.')[1].length 
    } 
    catch (error) { 
        //解決整數(shù)沒有小數(shù)點(diǎn)方法
        str1Length = 0 
    }
    try { 
        str2Length = str2.split('.')[1].length 
    } catch (error) { 
        str2Length = 0 
    }
    // 取兩個(gè)數(shù)的最小精度,即小數(shù)點(diǎn)后數(shù)字的最大長度
    var maxLen = Math.max(str1Length, str2Length)
    // step將兩個(gè)數(shù)都轉(zhuǎn)化為整數(shù)至少小數(shù)點(diǎn)后移多少位
    var step = Math.pow(10, maxLen)

    switch (symbol) {
        case "+":
        // toFixed()根據(jù)最小精度截取運(yùn)算結(jié)果
        result = ((num1 * step + num2 * step) / step).toFixed(maxLen)
        break;
        case "-":
        result = ((num1 * step - num2 * step) / step).toFixed(maxLen)
        break;
        case "*":
        result = (((num1 * step) * (num2 * step)) / step / step).toFixed(maxLen)
        break;
        case "/":
        result = ((num1 * step) / (num2 * step)).toFixed(maxLen)
        break;
        default:
        break;
    }
    // 由于toFixed方法返回結(jié)果是字符串,還需要轉(zhuǎn)回number輸出
    return Number(result)
}

0.1 + 0.2的計(jì)算,就可以調(diào)用numberCalculate(0.1,0.2,'+')進(jìn)行計(jì)算了。

以上就是一文解決前端JS小數(shù)運(yùn)算精度問題的詳細(xì)內(nèi)容,更多關(guān)于JS小數(shù)運(yùn)算精度的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Js放到HTML文件中的哪個(gè)位置有什么區(qū)別

    Js放到HTML文件中的哪個(gè)位置有什么區(qū)別

    先明白js能放在HTML的那個(gè)位置,分別是head和body中。大部分人都是放到head里面的。下面為大家介紹下放到這兩個(gè)地方的區(qū)別
    2013-08-08
  • js本地圖片預(yù)覽實(shí)現(xiàn)代碼

    js本地圖片預(yù)覽實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了js本地圖片預(yù)覽實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 一文弄懂JavaScript的繼承方式

    一文弄懂JavaScript的繼承方式

    這篇文章主要介紹了一文弄懂JavaScript的繼承方式,在java面試過程中經(jīng)常被問到j(luò)avascript中有幾種繼承方式,每種繼承方式是怎么實(shí)現(xiàn)的,文中給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • DOM節(jié)點(diǎn)的替換或修改函數(shù)replaceChild()用法實(shí)例

    DOM節(jié)點(diǎn)的替換或修改函數(shù)replaceChild()用法實(shí)例

    這篇文章主要介紹了DOM節(jié)點(diǎn)的替換或修改函數(shù)replaceChild()用法,實(shí)例分析了replaceChild()替換DOM節(jié)點(diǎn)的使用技巧,需要的朋友可以參考下
    2015-01-01
  • 微信上傳視頻文件提示(推薦)

    微信上傳視頻文件提示(推薦)

    晚上要下班了老板發(fā)來一個(gè)任務(wù):把一個(gè)300M左右的視頻壓縮到100M以內(nèi),以便在微信上發(fā)送。于是就是抽空搞了起來,下面小編把過程分享到腳本之家平臺,需要的朋友參考下吧
    2018-11-11
  • JS閉包經(jīng)典實(shí)例詳解

    JS閉包經(jīng)典實(shí)例詳解

    這篇文章主要介紹了JS閉包,結(jié)合一個(gè)經(jīng)典實(shí)例較為詳細(xì)的分析了javascript閉包的原理及使用方法,需要的朋友可以參考下
    2018-12-12
  • js實(shí)現(xiàn)移動端微信頁面禁止字體放大

    js實(shí)現(xiàn)移動端微信頁面禁止字體放大

    本文主要介紹了js實(shí)現(xiàn)移動端微信頁面禁止字體放大的方法,具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • 運(yùn)用js實(shí)現(xiàn)圖層拖拽的功能

    運(yùn)用js實(shí)現(xiàn)圖層拖拽的功能

    js拖拽是常見的網(wǎng)頁效果,本文將從零開始實(shí)現(xiàn)一個(gè)簡單的js插件,下面和小編來一起學(xué)習(xí)一下吧
    2019-05-05
  • JS圖片預(yù)加載插件詳解

    JS圖片預(yù)加載插件詳解

    這篇文章主要為大家詳細(xì)介紹了JS圖片預(yù)加載插件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • javascript模擬select,jselect的方法實(shí)現(xiàn)

    javascript模擬select,jselect的方法實(shí)現(xiàn)

    由于主流瀏覽器對select元素渲染不同,所以在每種瀏覽器下顯示也不一樣,最主要的是默認(rèn)情況下UI太粗糙,即使通過css加以美化也不能達(dá)到很美觀的效果
    2012-11-11

最新評論

德清县| 张家口市| 吉首市| 大悟县| 平泉县| 江山市| 滦南县| 田东县| 抚顺县| 鄢陵县| 霍城县| 揭阳市| 绥中县| 文成县| 长武县| 铜鼓县| 白朗县| 高邮市| 惠州市| 开鲁县| 玉门市| 山东| 武乡县| 出国| 镇原县| 娄底市| 平顺县| 洞口县| 鄂州市| 磐石市| 烟台市| 池州市| 彰武县| 陆丰市| 临漳县| 铜鼓县| 克拉玛依市| 资阳市| 峨边| 定日县| 廉江市|