JavaScript基礎——數值與數學
數值中的坑:
1、JavaScript內部,所有數字都是以64位浮點數形式存儲,即使整數也是如此。所以1與1.0是相同的同一個數,在JavaScript語言底層中根本沒有整數。但在位運算時JavaScript自動將64位浮點數轉換為32位整數後再運算。
2、浮點數不是精確的值,所以涉及小數的比較時要特別小心。尤其和 0.3 相關的如。0.1 + 0.2 = 0.30000000000000004而不是0.3,所以0.1 + 0.2 ===0.3 返回false。
3、數值精度:國際標準IEEE754,JavaScript浮點數的64個二進制位,從最左邊開始是這樣組成的--->第一位:符號位,0為正數,1為負數;第2位到第12位(共11位):指數部分;第13位到第64位(共52位):小數部分(有效數字)。符號位決定了一個數的正負,指數部分決定了數值的大小,小數部分決定了數值的精度。
指數部分一共有11個二進制位,因此大小範圍就是0到2047。IEEE 754 規定,如果指數部分的值在0到2047之間(不含兩個端點),那麽有效數字的第一位默認總是1,不保存在64位浮點數之中。也就是說,有效數字這時總是1.xx...xx
的形式,其中xx..xx
的部分保存在64位浮點數之中,最長可能為52位。因此,JavaScript 提供的有效數字最長為53個二進制位。
精度最多只能到53個二進制位,這意味著,絕對值小於等於2的53次方的整數,即-253到253,都可以精確表示。大於2的53次方的數值,都無法保持精度(無論是運算還是存儲)。由於2的53次方是一個16位的十進制數值,所以簡單的法則就是,JavaScript 對15位的十進制數都可以精確處理。
4、數值範圍:根據標準,64位浮點數的指數部分的長度是11個二進制位,意味著指數部分的最大值是2047(2的11次方減1)。也就是說,64位浮點數的指數部分的值最大為2047,分出一半表示負數,則 JavaScript 能夠表示的數值範圍為21024到2-1023(開區間),超出這個範圍的數無法表示。
如果一個數大於等於2的1024次方,那麽就會發生“正向溢出”,即 JavaScript 無法表示這麽大的數,這時就會返回Infinity
。
如果一個數小於等於2的-1075次方(指數部分最小值-1023,再加上小數部分的52位),那麽就會發生為“負向溢出”,即 JavaScript 無法表示這麽小的數,這時會直接返回0。
5、科學記數法:以下兩種情況,JavaScript 會自動將數值轉為科學計數法表示,其他情況都采用字面形式直接表示。(1)小數點前的數字多於21位。(2)小數點後的零多於5個。
特殊數值:
1、0:JavaScript分 +0、-0、0三種,但是本身大小相等。幾乎所有場合整零和負零都當作正常0,唯一區別的場合是 +0、-0做分母。除以正零得到+Infinity
,除以負零得到-Infinity。但是0/0得NaN。
NaN
與任何數(包括它自己)的運算,得到的都是NaN。
2、NaN:表示Not a Number,"非數字"。主要出現在將字符串解析成數字出錯的場合。NaN數據類型屬於Number。NaN
不等於任何值,包括它本身。
3、Infinite:無窮,有正負之分。
Number的屬性:
Number的方法:
- parseInt() ---1、將字符串轉換成整數,parseInt
的返回值只有兩種可能,要麽是一個十進制整數,要麽是NaN
。對於那些會自動轉為科學計數法的數字,parseInt
會將科學計數法的表示方法視為字符串,因此導致一些奇怪的結果。如果字符串以0x
或0X
開頭,parseInt
會將其按照十六進制數解析。如果字符串以0
開頭,將其按照10進制解析。
2、進制轉換(其他進制轉成十進制):parseInt
方法還可以接受第二個參數(2到36之間),表示被解析的值的進制,返回該值對應的十進制數。默認情況下,parseInt
的第二個參數為10,即默認是十進制轉十進制。如果第二個參數是0
、undefined
和null
,則直接忽略。先進行第一步計算轉換為數字,在進行第二步按進制計算。
- parseFloat() --- parseFloat
方法用於將一個字符串轉為浮點數。如果字符串符合科學計數法,則會進行相應的轉換,變成小數。
- isNaN() --- 判斷一個值是否為NaN
。
-isFinite() --- 表示某個值是否為正常的數值。
JavaScript基礎——數值與數學