中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS中內存與變量存儲的示例分析

發布時間:2021-08-07 10:23:35 來源:億速云 閱讀:125 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關JS中內存與變量存儲的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

JS神奇的Number

案例一:金額的計算與傳遞

18.9 * 100
=1889.9999999999998

案例二:違背的數學定律

0.1 + 0.2 === 0.3
// false

(function (a, b, c) {
    return a + b + c === a + ( b + c )
})(0.1, 0.2, 0.3)
// false

案例三:無限循環的加法

(function (num) {
    while(true) {
        if (++num % 13 === 0) {
            return num
        }
    }
})(2 ** 53)

案例四:JSON.parse

JSON.parse('{"a":180143985094813214124}')
//{a: 180143985094813220000}

通過上面的四個案例我們可以看出,數字在計算機中運算往往會給人帶來一些“驚喜”,要想防止這些意想不到的結果,我們首先要了解Number在Javascript中到底是怎么存儲的?

存儲數字

計算機是用二進制來存儲數據的,所以數字也需要轉換成相應二進制: 000 或者 111 的不同組合序列。

二進制如何轉換

如何將一個數字轉換成二進制,這里舉個例子說明一下:

把十進制小數 106.6953125106.6953125106.6953125 轉換成二進制

遇到小數轉換時,需要把整數和小數兩部分分別進行處理,整數 106106106 除以 222 直到商是 000 為止,取每次除 222 得到的余數結果

106 / 2 = 53  ...... 0
53  / 2 = 26  ...... 1
26  / 2 = 13  ...... 0
13  / 2 = 6   ...... 1
6   / 2 = 3   ...... 0
3   / 2 = 1   ...... 1
1   / 2 = 0   ...... 1
結果為得到的余數按照從右往左排列   1101010

小數 0.69531250.69531250.6953125 乘以 222 直到不存在小數位為止,并計下每次乘后的整數位結果,

0.6953125 x 2 = 1.390625  ...... 1
0.390625  x 2 = 0.78125   ...... 0
0.78125   x 2 = 1.5625    ...... 1
0.5625    x 2 = 1.125     ...... 1
0.125     x 2 = 0.25      ...... 0
0.25      x 2 = 0.5       ...... 0
0.5       x 2 = 1         ...... 1
結果為得到的整數位按照從左往右排列   1011001

將計算后的 000 111 序列拼在一起就得到轉換的二進制 1101010.10110011101010.10110011101010.1011001,用科學計數法表示為1.1010101011001?261.1010101011001*2^61.1010101011001?26,算出了二進制,接下來需要將它存進計算機中,在Javascript中不區分整數和小數,數字統一按照雙精度浮點數的要求來存儲,主要包含下面規則:

  • 使用 8bytes(64bits)8bytes(64bits)8bytes(64bits) 存儲雙精度浮點數

  • 存儲小數用科學計數法表示的數據

  • 第一位表示符號,后 111111 位表示指數,指數按照補位運算,即直接 102310231023 加指數位

  • 剩余 525252 位表示小數點后的尾數,超過 525252 位的部分 000 舍 111 進

由于指數位的 11 位不包括符號位,那么為了達到正負指數的效果,就引入了指數的偏移值。

用圖表示如下:

JS中內存與變量存儲的示例分析

我們將轉換好的二進制數按規則放進內存中,首先 106.6953125106.6953125106.6953125 是正數,所以符號位應該為 111, 000 表示正號, 111 表示負號(圖片應該為顯示 000,筆誤了)

JS中內存與變量存儲的示例分析

二進制 1.1010101011001?261.1010101011001*2^61.1010101011001?26 指數是 666(這里需要加上偏移量1023),轉成二進制為 100000001011000000010110000000101,指數位要求放置二進制的補碼,而補碼的計算規則是:

  • 正數的補碼就是其本身

  • 負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反, 最后+1. (即在反碼的基礎上+1)

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

所以圖片指數位應該填

JS中內存與變量存儲的示例分析

尾數位部分直接將小數轉換后的二進制填入即可

JS中內存與變量存儲的示例分析

數字最后就是以這樣的形式存入計算機中

why 0.1 + 0.2 !== 0.3?

在理解數字存儲的原理后,我們再來分析下為什么 0.1+0.2!==0.30.1 + 0.2 !== 0.30.1+0.2!==0.3

首先將 0.10.10.1 0.20.20.2 0.30.30.3 分別轉換成二進制

0.1 x 2 = 0.2  ...... 0
0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
0.6 x 2 = 1.2  ...... 1
0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
0.6 x 2 = 1.2  ...... 1
得到的整數位按照從左往右排列   000110011...

0.1→0.00011(0011)∞

0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
0.6 x 2 = 1.2  ...... 1
0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
0.6 x 2 = 1.2  ...... 1
0.2 x 2 = 0.4  ...... 0
得到的整數位按照從左往右排列   001100110...

0.2→0.00110(0110)∞

0.3 x 2 = 0.6  ...... 0
0.6 x 2 = 1.2  ...... 1
0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
0.6 x 2 = 1.2  ...... 1
0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
得到的整數位按照從左往右排列   010011001...

0.3→0.01001(1001)∞

統一用科學計數法表示為

0.1→0.00011(0011)∞→1.(1001)∞?2?4

0.2→0.00110(0110)∞→1.(1001)∞?2?3

0.3→0.01001(1001)∞→1.(0011)∞?2?2

放入計算機中雙精度浮點數存儲,最后的紅色表示超過尾數位的二進制,即需要做舍0進1處理

JS中內存與變量存儲的示例分析

則經過64位雙精度存儲后,二進制如下表示
0.1→0?01111111011?(1001)121010

0.2→0?01111111100?(1001)121010

0.3→0?01111111101?(0011)120011

此時 0.1+0.20.1 + 0.20.1+0.2 可以看出與 0.30.30.3 不相等

JS中內存與變量存儲的示例分析

這就是數字在計算機中運算往往會給人帶來一些“驚喜”!

關于“JS中內存與變量存儲的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

台山市| 宣威市| 桐梓县| 丰县| 南宁市| 台湾省| 广平县| 虞城县| 南部县| 湾仔区| 潞西市| 泰和县| 东方市| 开江县| 鄂州市| 巴东县| 丰镇市| 泰和县| 海城市| 龙川县| 吉首市| 广南县| 宜章县| 水城县| 荥经县| 石门县| 溧水县| 化德县| 龙胜| 金堂县| 当阳市| 海安县| 辉南县| 涿州市| 昭平县| 牡丹江市| 锡林浩特市| 本溪市| 镇远县| 盘山县| 中宁县|