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

JS數(shù)字精度丟失的原因及解決方案

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

前言

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

精度丟失

例如,我們?cè)谟?jì)算0.1 + 0.1得到的結(jié)果是0.2,但是計(jì)算0.1 + 0.2的結(jié)果并不是0.3,而是0.30000000000000004

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

例如1.2 - 1的結(jié)果是0.19999999999999996

不過(guò)這并不是JavaScript獨(dú)有的,其他編程語(yǔ)言也會(huì)存在同樣的問(wèn)題。

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

print(.1 + .2) 

得到的結(jié)果同樣是:0.30000000000000004

原因

這個(gè)問(wèn)題的主要原因是計(jì)算機(jī)將數(shù)據(jù)存儲(chǔ)為二進(jìn)制。

如何將整數(shù)從十進(jìn)制轉(zhuǎn)換為二進(jìn)制

十進(jìn)制整數(shù)可以通過(guò)將其除以 2 轉(zhuǎn)換為二進(jìn)制。取商,并繼續(xù)除以 2,直到達(dá)到零。

每次執(zhí)行此除法時(shí),請(qǐng)記下余數(shù)?,F(xiàn)在反轉(zhuǎn)余數(shù)列表,得到二進(jìn)制形式的數(shù)字。

舉個(gè)例子,我想把29轉(zhuǎn)成二進(jìn)制:

29÷2=14余1

14÷2=7余0

7÷2=3余1

3÷2=1余1

1÷2=0余1

代表十進(jìn)制 29 的二進(jìn)制數(shù)是11101.

例如:

  • 1 也就是1

  • 10 也就是1010

將小數(shù)從十進(jìn)制轉(zhuǎn)換為二進(jìn)制

十進(jìn)制小數(shù)轉(zhuǎn)換成二進(jìn)制小數(shù)采用"乘2取整,順序排列"法。具體做法是:用2乘十進(jìn)制小數(shù),可以得到積,將積的整數(shù)部分取出,再用2乘余下的小數(shù)部分,又得到一個(gè)積,再將積的整數(shù)部分取出,如此進(jìn)行,直到積中的小數(shù)部分為零,此時(shí)0或1為二進(jìn)制的最后一位。或者達(dá)到所要求的精度為止。

舉個(gè)例子:我想把0.375轉(zhuǎn)成二進(jìn)制:

0.375*2=0.75 得到0

0.75*2=1.5得到1

0.5*2=1 得到1,小數(shù)沒(méi)了,結(jié)束。最終轉(zhuǎn)為二進(jìn)制是0.011

例如:

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

并非每個(gè)十進(jìn)制數(shù)都可以用這種二進(jìn)制格式完美表示,因?yàn)橛行?shù)字可能轉(zhuǎn)成

JavaScript 在計(jì)算時(shí),會(huì)先將10進(jìn)制轉(zhuǎn)為二進(jìn)制,在進(jìn)行計(jì)算。

0.00011001100110011001100110011001100110011001100110011010 +
0.0011001100110011001100110011001100110011001100110011010 =
0.0100110011001100110011001100110011001100110011001100111

這里得到的結(jié)果0.0100110011001100110011001100110011001100110011001100111再轉(zhuǎn)換成十進(jìn)制就是0.30000000000000004

解決方案

第三方庫(kù)

Decimal

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

bignumber

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

變成整數(shù)

主要思想是:將小數(shù)先轉(zhuǎn)換成拆分兩個(gè)字符串,然后計(jì)算小數(shù)部分的字符串的長(zhǎng)度,然后利用這個(gè)長(zhǎng)度將小數(shù)變成整數(shù)!

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;
}

總結(jié)

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

  • 微信JSAPI Ticket接口簽名詳解

    微信JSAPI Ticket接口簽名詳解

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

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

    今天在后臺(tái)寫了個(gè)類,后來(lái)才發(fā)現(xiàn),需要在JS上做..于是把代碼拷到j(luò)s上進(jìn)行修改,代碼中用到TrimStart,TrimEnd,Trim等方法,在網(wǎng)上找半天竟然沒(méi)找到.要么就只能清除空格的!
    2011-01-01
  • 跟我學(xué)習(xí)javascript的undefined與null

    跟我學(xué)習(xí)javascript的undefined與null

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

    對(duì)layui中表單元素的使用詳解

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

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

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

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

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

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

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

    利用JS如何獲取form表單數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于利用JS如何獲取form表單數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • javaScript中一些常見(jiàn)的數(shù)據(jù)類型檢查校驗(yàn)

    javaScript中一些常見(jiàn)的數(shù)據(jù)類型檢查校驗(yàn)

    最近在面試的時(shí)候又被問(wèn)到JS中檢查校驗(yàn)數(shù)據(jù)類型的方法,所以這篇文章主要給大家介紹了關(guān)于javaScript中一些常見(jiàn)的數(shù)據(jù)類型檢查校驗(yàn)的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 最新評(píng)論