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

JS數字精度丟失的原因及解決方案

 更新時間:2022年04月27日 09:13:18   作者:半夏的故事  
JS的數字類型一旦數字超過限值,JS將會丟失精度,導致前后端的值出現(xiàn)不一致,這篇文章主要給大家介紹了關于JS數字精度丟失的原因分析及解決方法,需要的朋友可以參考下

前言

在JavaScript中計算兩個十進制數的和,有時候會出現(xiàn)令人驚訝的結果,相信這個大家也都知道了!

精度丟失

例如,我們在計算0.1 + 0.1得到的結果是0.2,但是計算0.1 + 0.2的結果并不是0.3,而是0.30000000000000004

這種現(xiàn)象不僅出現(xiàn)在加法,在減法中也會出現(xiàn)類似的結果。

例如1.2 - 1的結果是0.19999999999999996

不過這并不是JavaScript獨有的,其他編程語言也會存在同樣的問題。

例如在Python環(huán)境下輸出。

print(.1 + .2) 

得到的結果同樣是:0.30000000000000004

原因

這個問題的主要原因是計算機將數據存儲為二進制。

如何將整數從十進制轉換為二進制

十進制整數可以通過將其除以 2 轉換為二進制。取商,并繼續(xù)除以 2,直到達到零。

每次執(zhí)行此除法時,請記下余數。現(xiàn)在反轉余數列表,得到二進制形式的數字。

舉個例子,我想把29轉成二進制:

29÷2=14余1

14÷2=7余0

7÷2=3余1

3÷2=1余1

1÷2=0余1

代表十進制 29 的二進制數是11101.

例如:

  • 1 也就是1

  • 10 也就是1010

將小數從十進制轉換為二進制

十進制小數轉換成二進制小數采用"乘2取整,順序排列"法。具體做法是:用2乘十進制小數,可以得到積,將積的整數部分取出,再用2乘余下的小數部分,又得到一個積,再將積的整數部分取出,如此進行,直到積中的小數部分為零,此時0或1為二進制的最后一位?;蛘哌_到所要求的精度為止。

舉個例子:我想把0.375轉成二進制:

0.375*2=0.75 得到0

0.75*2=1.5得到1

0.5*2=1 得到1,小數沒了,結束。最終轉為二進制是0.011

例如:

  • 0.1 也就是0.0001100110011001100110011001100110011001100110011001101
  • 0.2 也就是0.001100110011001100110011001100110011001100110011001101

并非每個十進制數都可以用這種二進制格式完美表示,因為有些數字可能轉成

JavaScript 在計算時,會先將10進制轉為二進制,在進行計算。

0.00011001100110011001100110011001100110011001100110011010 +
0.0011001100110011001100110011001100110011001100110011010 =
0.0100110011001100110011001100110011001100110011001100111

這里得到的結果0.0100110011001100110011001100110011001100110011001100111再轉換成十進制就是0.30000000000000004

解決方案

第三方庫

Decimal

x = new Decimal(0.1)
y = x.plus(0.2) 

bignumber

x = new BigNumber(0.1)
y = x.plus(0.2)    

變成整數

主要思想是:將小數先轉換成拆分兩個字符串,然后計算小數部分的字符串的長度,然后利用這個長度將小數變成整數!

function add(num1, num2) {
  const num1Len = (num1.toString().split('.')[1] ).length;
  const num2Len = (num2.toString().split('.')[1] ).length;
  const maxLen = Math.pow(10, Math.max(num1Len, num2Len));
  return (num1 * maxLen + num2 * maxLen) / maxLen;
}

總結

到此這篇關于JS數字精度丟失的原因分析及解決的文章就介紹到這了,更多相關JS數字精度丟失內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • js實現(xiàn)大轉盤抽獎游戲實例

    js實現(xiàn)大轉盤抽獎游戲實例

    這篇文章主要介紹了js實現(xiàn)大轉盤抽獎游戲的方法,實例分析了javascript基于數組、隨機數等實現(xiàn)抽獎游戲的技巧,需要的朋友可以參考下
    2015-06-06
  • 微信JSAPI Ticket接口簽名詳解

    微信JSAPI Ticket接口簽名詳解

    這篇文章主要為大家詳細介紹了微信JSAPI Ticket接口簽名,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • C#中TrimStart,TrimEnd,Trim在javascript上的實現(xiàn)

    C#中TrimStart,TrimEnd,Trim在javascript上的實現(xiàn)

    今天在后臺寫了個類,后來才發(fā)現(xiàn),需要在JS上做..于是把代碼拷到js上進行修改,代碼中用到TrimStart,TrimEnd,Trim等方法,在網上找半天竟然沒找到.要么就只能清除空格的!
    2011-01-01
  • 跟我學習javascript的undefined與null

    跟我學習javascript的undefined與null

    跟我學習javascript的undefined與null,從定義上理解null和undefined,告訴大家提高undefined性能的方法,感興趣的小伙伴們可以參考一下
    2015-11-11
  • 對layui中表單元素的使用詳解

    對layui中表單元素的使用詳解

    今天小編就為大家分享一篇對layui中表單元素的使用詳解。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • GoJs?圖片繪圖模板Picture使用示例詳解

    GoJs?圖片繪圖模板Picture使用示例詳解

    這篇文章主要為大家介紹了GoJs?圖片繪圖模板Picture使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • js event事件的傳遞與冒泡處理

    js event事件的傳遞與冒泡處理

    與Netscape相反,IE中的事件傳遞方向是從事情發(fā)生的對象開始,然后依次由該對象向所在的父節(jié)點傳遞。
    2009-12-12
  • Jquery和JS用外部變量獲取Ajax返回的參數值的方法實例(超簡單)

    Jquery和JS用外部變量獲取Ajax返回的參數值的方法實例(超簡單)

    Jquery和JS用外部變量獲取Ajax返回的參數值的方法實例(超簡單),需要的朋友可以參考一下
    2013-06-06
  • 利用JS如何獲取form表單數據

    利用JS如何獲取form表單數據

    這篇文章主要給大家介紹了關于利用JS如何獲取form表單數據的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用JS具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-12-12
  • javaScript中一些常見的數據類型檢查校驗

    javaScript中一些常見的數據類型檢查校驗

    最近在面試的時候又被問到JS中檢查校驗數據類型的方法,所以這篇文章主要給大家介紹了關于javaScript中一些常見的數據類型檢查校驗的相關資料,需要的朋友可以參考下
    2022-05-05

最新評論

廊坊市| 女性| 聊城市| 大宁县| 扶绥县| 贞丰县| 汨罗市| 甘德县| 仁布县| 文水县| 札达县| 盐亭县| 榕江县| 安阳县| 广饶县| 德化县| 通化市| 邵阳市| 无极县| 临湘市| 喀喇沁旗| 萝北县| 南丹县| 扎赉特旗| 金川县| 恩施市| 贵州省| 河间市| 邓州市| 疏勒县| 阿拉善盟| 福海县| 青阳县| 凤凰县| 汶川县| 达孜县| 罗江县| 波密县| 静海县| 湾仔区| 迁安市|