帶你讀書之“紅寶書”:第三章 語法基礎(chǔ)(中)之 數(shù)據(jù)類型中部分Number類型①

「這是我參與2022首次更文挑戰(zhàn)的第8天,活動詳情查看:2022首次更文挑戰(zhàn)

寫在前頭

大多數(shù)小伙伴看技術(shù)書籍都會用“啃”來描述讀書的直觀感受,當然我也是一個前端小白,白的透明那種,但是我在讀技術(shù)書籍感覺到“啃”的時候,我希望把我啃紅寶書第四版的過程的想法,總結(jié)帶給大家,以供后來者能夠更快上手。

注: 本文由于作者水平原因,如有錯誤之處,懇請大家指正,另外隨著學習的深入,體會的加深,我會不斷回來更新,修改這類文章。

思維導圖

image.png

脈絡(luò)

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

3.4數(shù)據(jù)類型

image.png

3.4.5Number類型

image.png

0. 整數(shù)

image.png
  1. 表示格式

書中原話:number類型使用IEEE 754格式表示整數(shù)和浮點數(shù)。

  1. 數(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ù)

image.png
  1. 定義浮點數(shù)

由于存儲空間問題,JavaScript總是將浮點數(shù)盡可能轉(zhuǎn)換為整數(shù)。為了避免轉(zhuǎn)換,成功的定義。必須有小數(shù)點,小數(shù)點紅藕必須有數(shù)字,特殊情況:1.0 這種依然會被轉(zhuǎn)換為整數(shù)。

  1. 內(nèi)存空間

浮點數(shù)的存儲空間是整數(shù)的2倍。

  1. 科學記數(shù)法

高中就學過了

let num1 = 980000;
let num2 = 9.8e5;
console.log(num1 == num2); // true

注意: e和E均可以。

  1. 算術(shù)計算

浮點數(shù)精度是17位,多個浮點數(shù)相加可能會存在計算偏差。

2. 舍入誤差(補充知識)

image.png
  1. IEEE 二進制浮點數(shù)算術(shù)標準

定義:。這個標準定義了表示浮點數(shù)的格式(包括負零-0)與反常值(denormal number),一些特殊數(shù)值((無窮(Inf)與非數(shù)值(NaN)),以及這些數(shù)值的“浮點數(shù)運算符”;

指明:它也指明了四種數(shù)值舍入規(guī)則和五種例外狀況(包括例外發(fā)生的時機與處理方式)。

  1. 雙精度浮點數(shù)

雙精度浮點數(shù)使用 64 個比特存儲。

符號位:1個比特存儲。 用于表示正負符號。符號位正浮點數(shù)使用 0 表示,負浮點數(shù)使用 1 表示。

指數(shù)位:11個比特存儲。

尾數(shù)位:52 個比特存儲。

這三個位構(gòu)成一個雙精度浮點數(shù)。

  1. 十進制小數(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ù)。

  1. 常量 Number.EPSILON

驗證兩個浮點數(shù)的相等性

let num1 = 980000;
let num2 = 9.8e5;
if (num1-num2 <  Number.EPSILON) {
    console.log('兩個浮點數(shù)的相等');
}
  1. 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é)可以自己查一下。就不插鏈接了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容