亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

JS存在精度問題

在控制臺可以試一下
0.1 + 0.2 的結果是0.30000000000000004
js的運算下 0.1 + 0.2 != 0.3

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

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

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

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

解決方案

思路:

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

    switch (symbol) {
        case "+":
        // toFixed()根據(jù)最小精度截取運算結果
        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方法返回結果是字符串,還需要轉(zhuǎn)回number輸出
    return Number(result)
}

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

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

相關文章

  • JS原型鏈怎么理解

    JS原型鏈怎么理解

    本文重點給大家介紹javascript中的原型鏈知識,本文介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看下吧
    2016-06-06
  • 基于事件冒泡、事件捕獲和事件委托詳解

    基于事件冒泡、事件捕獲和事件委托詳解

    這篇文章主要介紹了事件冒泡、事件捕獲和事件委托,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 解決uni-app報錯Error:?read?EBADF?at?Pipe?.?onStreamRead...

    解決uni-app報錯Error:?read?EBADF?at?Pipe?.?onStreamRead...

    這篇文章主要介紹了uni-app報錯Error:?read?EBADF?at?Pipe?.?onStreamRead...解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • jQuery中選擇查找自定義屬性具有特定值的所有元素

    jQuery中選擇查找自定義屬性具有特定值的所有元素

    同樣在HTML5可以通過data-自定義屬性名來給元素添加自定義的屬性名。一旦添加完成之后。通過JS可以獲取以及設置自定義屬性。這篇文章主要介紹了jQuery中選擇查找自定義屬性具有特定值的所有元素
    2023-02-02
  • 工作中比較實用的JavaScript驗證和數(shù)據(jù)處理的干貨(經(jīng)典)

    工作中比較實用的JavaScript驗證和數(shù)據(jù)處理的干貨(經(jīng)典)

    工作中比較實用的JavaScript驗證和數(shù)據(jù)處理知識經(jīng)常會用到,下面小編通過查閱相關資料及日常記錄的知識分享到腳本之家平臺,供大家參考
    2016-08-08
  • javascript顯式類型轉(zhuǎn)換實例分析

    javascript顯式類型轉(zhuǎn)換實例分析

    這篇文章主要介紹了javascript顯式類型轉(zhuǎn)換,實例分析了javascript實現(xiàn)類型轉(zhuǎn)換的常用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • javascript連續(xù)賦值問題

    javascript連續(xù)賦值問題

    本文通過具體的示例來給大家詳細解釋了下javascript的連續(xù)賦值問題,十分的實用,有需要的小伙伴可以參考下。
    2015-07-07
  • 微信小程序之間的參數(shù)傳遞、獲取的操作方法

    微信小程序之間的參數(shù)傳遞、獲取的操作方法

    這篇文章主要介紹了微信小程序中如何獲取和傳遞參數(shù),包括獲取當前頁面參數(shù)、單獨input文本框參數(shù)的獲取、表單獲取參數(shù)信息、點擊表格單元格信息獲取行ID以及前端頁面跳轉(zhuǎn)傳遞多個參數(shù)等,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • java實現(xiàn)單鏈表增刪改查的實例代碼詳解

    java實現(xiàn)單鏈表增刪改查的實例代碼詳解

    在本篇文章里小編給大家整理了關于java實現(xiàn)單鏈表增刪改查的實例內(nèi)容,需要的朋友們可以參考下。
    2019-08-08
  • 分享十八個殺手級JavaScript單行代碼

    分享十八個殺手級JavaScript單行代碼

    這篇文章主要給大家分享了十八個殺手級JavaScript單行代碼,這些單行代碼可以幫助你提高工作效率并可以幫助調(diào)試代碼,對大家學習或者使用JavaScript具有一定的參考學習價值,需要的朋友可以參考下
    2021-10-10

最新評論