「這是我參與2022首次更文挑戰(zhàn)的第8天,活動詳情查看:2022首次更文挑戰(zhàn)」
寫在前頭
大多數(shù)小伙伴看技術(shù)書籍都會用“啃”來描述讀書的直觀感受,當然我也是一個前端小白,白的透明那種,但是我在讀技術(shù)書籍感覺到“啃”的時候,我希望把我啃紅寶書第四版的過程的想法,總結(jié)帶給大家,以供后來者能夠更快上手。
注: 本文由于作者水平原因,如有錯誤之處,懇請大家指正,另外隨著學習的深入,體會的加深,我會不斷回來更新,修改這類文章。
思維導圖

脈絡(luò)
這小節(jié)就是介紹了3.4數(shù)據(jù)類型中的3.4.5Number類型的整數(shù),浮點數(shù),舍入誤差。
3.4數(shù)據(jù)類型

3.4.5Number類型

0. 整數(shù)

- 表示格式
書中原話:number類型使用IEEE 754格式表示整數(shù)和浮點數(shù)。
- 數(shù)值字面量格式
什么是字面量? 字面量:用于表達固定值的符號。
十進制
不用進制轉(zhuǎn)換,一般默認十進制,可以直接書寫。八進制
①普通表示格式
第一個數(shù)字為0。后面跟八進制的數(shù)字,滿8進位,超等8,去前綴0,看為十進制。
書中例子也十分詳細,我還是寫一下復習一下吧。
let num = 08;
console.log(num); // 8 前綴0之后數(shù)字不能有8以上的數(shù)字(包括8),有則去掉前綴看做十進制數(shù)字
②嚴格模式表示
原話:如果要表示八進制值,應(yīng)該使用前綴 0o。
只使用0會報錯。
- 十六進制
普通表示格式
不管什么模式下,十六進制都得使用0x前綴來創(chuàng)建。
- 數(shù)學操作
注意: 書中原話:使用八進制和十六進制格式創(chuàng)建的數(shù)值在所有數(shù)學操作中都被視為十進制數(shù)值。
1.浮點數(shù)

- 定義浮點數(shù)
由于存儲空間問題,JavaScript總是將浮點數(shù)盡可能轉(zhuǎn)換為整數(shù)。為了避免轉(zhuǎn)換,成功的定義。必須有小數(shù)點,小數(shù)點紅藕必須有數(shù)字,特殊情況:1.0 這種依然會被轉(zhuǎn)換為整數(shù)。
- 內(nèi)存空間
浮點數(shù)的存儲空間是整數(shù)的2倍。
- 科學記數(shù)法
高中就學過了
let num1 = 980000;
let num2 = 9.8e5;
console.log(num1 == num2); // true
注意: e和E均可以。
- 算術(shù)計算
浮點數(shù)精度是17位,多個浮點數(shù)相加可能會存在計算偏差。
2. 舍入誤差(補充知識)

- IEEE 二進制浮點數(shù)算術(shù)標準
定義:。這個標準定義了表示浮點數(shù)的格式(包括負零-0)與反常值(denormal number),一些特殊數(shù)值((無窮(Inf)與非數(shù)值(NaN)),以及這些數(shù)值的“浮點數(shù)運算符”;
指明:它也指明了四種數(shù)值舍入規(guī)則和五種例外狀況(包括例外發(fā)生的時機與處理方式)。
- 雙精度浮點數(shù)
雙精度浮點數(shù)使用 64 個比特存儲。
符號位:1個比特存儲。 用于表示正負符號。符號位正浮點數(shù)使用 0 表示,負浮點數(shù)使用 1 表示。
指數(shù)位:11個比特存儲。
尾數(shù)位:52 個比特存儲。
這三個位構(gòu)成一個雙精度浮點數(shù)。
- 十進制小數(shù)轉(zhuǎn)為二進制小數(shù)
①基本轉(zhuǎn)換
十進制小數(shù)不斷乘2,取整。直到小數(shù)位為0。
②轉(zhuǎn)換有限二進制條件
有些十進制小數(shù)不能轉(zhuǎn)為有限位數(shù)的二進制小數(shù)。所有小數(shù)部分不是 2^-n (n 為整數(shù))的十進制小數(shù)都不能轉(zhuǎn)為有限的二進制小數(shù)。
- 常量 Number.EPSILON
驗證兩個浮點數(shù)的相等性
let num1 = 980000;
let num2 = 9.8e5;
if (num1-num2 < Number.EPSILON) {
console.log('兩個浮點數(shù)的相等');
}
- JavaScript 里關(guān)于數(shù)字的運算
①誤差由來
JavaScript 里關(guān)于數(shù)字的運算,都是先轉(zhuǎn)為二進制,再轉(zhuǎn)成二進制的科學計數(shù)法進行存儲,再取出存
儲值轉(zhuǎn)為二級制,最后進行運算。而在先存儲再取出值的過程中,就可能丟失精度。
②0.1與0.2相加
0.1+0.2 不等于 0.3這個問題很經(jīng)典。
誤差原因就是上面說的,0.1和0.2在轉(zhuǎn)換為二進制小數(shù)的時候,這兩個數(shù)字的第 51 位被進位而
填入了 1,因此這兩個數(shù)字都比原本不進位的數(shù)字大。然后相加自然就比0.3大了。具體細節(jié)可以自己查一下。就不插鏈接了。