JS原始類型-Number數字類型


定義

JavaScript采用IEEE 754格式來表示數字,所以不區分整數和浮點數,JS中的數字都是用浮點數表示的。由於浮點型數值占據的內存空間是整數型的兩倍,所以JS會不失時機的把浮點數值轉換成整數,比如說本身就是一個整數或者小數點后面沒有任何有效數值,這個數值就會被當做整數來保存

1.0 === 1; // true

整數

JS有四種表示整數的字面量格式:十進制、二進制、八進制、十六進制。在進行算數運算時,所有二進制、八進制和十六進制都會轉換成十進制數值。

說明: 當一個數字直接出現在JS程序中時,稱作數字的字面量。當使用new操作符表示數值時,稱作Number對象。

二進制:二進制前兩位必須是0b,后面是0-1的字符序列。如果數值超出范圍會報錯。

八進制:八進制的第一位必須是0,后面是0-7數字序列。如果數值超出范圍,前導0會被忽略,后面數值被當做十進制解析。(八進制字面量在嚴格模式下報錯,部分JS引擎不支持,所以不建議使用)

十六進制:十六進制前兩位必須是0x,后面是0-9,a-f的字符序列,字母不需區分大小。如果數值超出范圍會報錯。

0b101; // 5
012; // 10
09; // 9 
0xf; // 15

浮點數

浮點數是指數值中必須包含一個小數點,且小數點后面至少一位數字。浮點數只可用十進制表示。

由於JS采用IEEE 754格式表示數字,所以浮點數不是精確值,這是所有采用IEEE 754格式語言的通病,所以涉及到浮點數的比較和運算要格外小心。

0.1 + 0.2 === 0.3; // false
0.1 * 3 === 0.3; // false

科學計數法

對於特別大和特別小的數值,可以使用科學計數法e或E來表示,e后面跟着一個整數用來表示指數。

當數值小於1且小數點后有大於等於6個0時,JS會自動將數值轉換為科學計數法。

當數值整數位大於等於22位時,JS會自動將數值轉換為科學計數法。

0.0000003 // 3e-7
1234567890123456789012 //1.2345678901234568e+21
123456789012345678901 //123456789012345680000

數值精度

JS數字類型在內部表示為64位二進制浮點,表現形式如下:

第1位:        符號位,0表示正數,1表示負數
第2位到第12位: 儲存指數部分
第13位到第64位:儲存小數部分(即有效數字)

綜上,JS提供的數字最長為53個二進制位,所以絕對值小於2的53次方的整數都可以精確表示。換算成十進制,JS數字最高精度是16位(如果整數位是0,表示小數點后16位;如果整數部分不為0,表示整體保留16位)。

Math.pow(2, 53) // 9007199254740992
0.1234567890123456 // 0.1234567890123456 
1.234567890123456 // 1.234567890123456

Math.pow(2, 53) + 1 // 9007199254740992 超出精度,不再精確
90071992547409921 // 90071992547409920 超出精度,不再精確
1.2345678901234566 // 1.2345678901234567 超出精度,不再精確

數值范圍

64位浮點數的指數部分長度是11個二進制位,所以指數最大是2047(2^11 - 1)。分出一半表示負數,JS的數值范圍是2^1024 到 2^-1023.

JS中的最大值保存在Number.MAX_VALUE中,最小值保存在Number.MIN_VALUE中

如果超過最大值,JS會返回Infinity,稱作正向溢出;如果比最小值還小,由於數值已經無限接近於0,所以會返回0,稱作負向溢出。

當運算數和最值是在同一精度上時,才可以與最值發生運算

Number.MAX_VALUE + 1 // 1.7976931348623157e+308
Number.MAX_VALUE+1e292 // Infinity

特殊數值

JS中有九個特殊數值:Number.MAX_VALUE、Number.MIN_VALUE、Number.POSITIVE_INFINITY、Number.NEGATIVE_INFINITY、Number.MAX_SAFE_INTEGER、Number.MIN_SAFE_INTEGER、Number.NaN、+0、-0。

最值

Number.MAX_VALUE、Number.MIN_VALUE分別表示最大值和最小值

Infinity

Number.POSITIVE_INFINITY對應的是Infinity,代表正無窮;Number.NEGATIVE_INFINITY對應的是-Infinity,代表負無窮。可以通過isFinite()確定是否是有窮的。

Number.POSITIVE_INFINITY === Infinity // true
Number.NEGATIVE_INFINITY === -Infinity // true
isFinite(Infinity) // false
isFinite(1) // true

安全最值

Number.MAX_SAFE_INTEGER、Number.MIN_SAFE_INTEGER表示最大整數和最小整數

Number.MAX_SAFE_INTEGER === Math.pow(2, 53)-1 // true
Number.MIN_SAFE_INTEGER === -(Math.pow(2, 53)-1) // true

NaN

NaN表示非數字,它和任何值都不相等(包括自身),可以通過isNaN()判斷一個值是不是NaN,它包含隱式類型轉換函數Number()。

isNaN(10) //false
isNaN('10') //false
isNaN([]) // false
isNaN(null) // false

isNaN(NaN) //true
isNaN('Hello') //true
isNaN({}) // true
isNaN(undefined) // true

[]null調用Number()轉型函數后返回0,而{}和·undefined調用Number()轉型函數后返回NaN

擴展: ES6為Number類型新增了一個isNaN()靜態方法,它不包函隱式類型轉換,因此只有值是NaN是才返回true,其他值均返回false

正負零

在JS中,正負零是恆等的

-0 === +0;// true
0 === -0;// true
0 === +0;// true

數值轉換

三個函數可以把非數值轉換為數值:Number()、parseInt()、parseFloat()。

Number()

當Number()作為轉型函數調用時,可以把任意類型的值轉換成數值。

Number(11) // 11
Number(011) //  9
Number(0x11) //  17
Number(undefined) // NaN
Number(null) // 0
Number(true) // 1
Number(false) // 0

Number()解析字符串時,會把前置空格去掉,空字符串和空白字符都會轉換成0.

Number()會自動把字符串形式的十進制數和十六進制數都轉換為十進制,但是不識別八進制,會被當做十進制數處理。

其他情況字符串,轉換成NaN

Number('   123') // 123
Number(' ') // 0

Number('11') // 11
Number('011') //  11
Number('0x11') //  17

Number('hello') // NaN

Number()函數解析對象時,步驟如下:

  1. 先調用對象的valueOf()方法,如果返回原始類型值,就對返回值調用Number()函數;如果返回非原始類型值,就接着調用toString()方法。
  2. 如果toString()方法返回原始類型值,就對返回值調用Number()函數;如果返回還是對象就返回NaN。
Number([1]) // 1
Number([1,2]) // NaN
Number({}) // NaN

parseInt()

parseInt()方法用於把字符串轉換成整數,轉換時會忽略前導空格,如果第一個字符非數字或非負號,結果返回NaN。如果是數字,繼續向后解析直到遇到非數字字符。

parseInt('  10px') // 10
parseInt('  -10px') // -10
parseInt('10.5') // 10

parseInt()方法在解析各種進制的數值時均返回十進制數,但是解析八進制字符串時,會當做十進制處理輸出。對於會自動轉換成科學計數法的數值,會把科學計數法當做字符串處理。

parseInt(11) // 11
parseInt(011) // 9
parseInt(0x11) // 17

parseInt('11') // 11
parseInt('011') // 11
parseInt('0x11') // 17

parseInt(0.0000008) // 8
// 等價於
parseInt('8e-7')) // 8

parseInt()方法可以接收第二個參數(2到36之間),表示解析值的進制,默認是10表示十進制。

console.log(parseInt('11',2));//3
console.log(parseInt('11',8));//9
console.log(parseInt('11',10));//11
console.log(parseInt('11',16));//17

parseFloat()

parseFloat()方法用於把字符串轉換成浮點數,解析時同樣會忽略前導空格,從第一個數字開始解析直到遇到無效的浮點值結束。


parseFloat('20.30.3') // 20.3
parseFloat('-20.00元')  // -20

科學計數法表示的數字會自動進行轉換,然后再求浮點值

parseFloat('314e-2') // 3.14
parseFloat('0.0314e+2') // 3.14

parseFloat()可以識別不同進制的數字,但只能解析十進制字符串,八進制字符串會被當做十進制處理。

parseFloat(11) // 11
parseFloat(011) // 9
parseFloat(0x11) // 17

parseFloat('11') // 11
parseFloat('011') // 11
parseFloat('0x11') // 0

實例方法

Number()對象有六個實例方法:toString()、toLocaleString()、valueOf()這三種繼承自Object對象;toFixed、toExponential()、toPrecision()這三種改變數值顯示方式並轉換為字符串形式

繼承方法

valueOf()方法返回對象數字字面量

toString()方法將數字轉換為字符串

toLocaleString()方法將數字轉換為本地格式字符串

(123).valueOf() // 123
(123).toString() // '123'
(123).toLocaleString() // '123'

注意: 如果數字不加括號,后面的點會被當做小數點處理,所以會報錯。可以使用兩個點或者為數字加括號避免出錯。

toString()方法接收一個參數,參數為2-36間的一個整數,表示輸出的進制,默認是十進制。

(10).toString(2) // '1010'
(10).toString(8) // '12'
(10).toString(16) // 'a'

toFixed()

toFixed()方法接收一個參數(0-20之間的整數),表示保留小數的位數,返回四舍五入后數字的字符串形式。如果不傳參參數相當於0


(100.234).toFixed(2) // '100.23'
(100.234).toFixed(0) // '100'
(100.234).toFixed() // '100'

toExponential()

toExponential()方法接收一個參數(0-20之間的整數),表示保留小數的位數,返回四舍五入后科學計數法的字符串形式。如果不參數會保留盡可能多的有效數字。

(100.234).toExponential(2) // "1.00e+2"
(100.234).toExponential(0) // "1e+2"
(100.234).toExponential() // "1.00234e+2"

toPrecision()

toPrecision()方法接收一個參數(1-21之間的整數),表示所有數字的位數,返回指定位數的字符串,它會自動調用toFixed()或toExponential()方法。如果不傳參相當於調用toString()方法

(100.234).toPrecision(2) // "1.0e+2"
(100.234).toPrecision(3) // "100"
(100.234).toPrecision(0) // 報錯
(100.234).toPrecision() // "100.234"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM