欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文解決前端JS小數運算精度問題

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

前言

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

JS存在精度問題

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

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

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

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

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

解決方案

思路:

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

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

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

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

相關文章

  • 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驗證和數據處理的干貨(經典)

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

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

    javascript顯式類型轉換實例分析

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

    javascript連續(xù)賦值問題

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

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

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

    java實現單鏈表增刪改查的實例代碼詳解

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

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

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

最新評論