### number類型
* 浮點類型
* 數值范圍
* NaN
* 數值轉換
* 數值格式化
* * * * *
#### 浮點類型
> 所謂浮點類型,就是該數值中含有小數點,并且小數點后面至少有一位數字,但小數點前面可以沒有整數(此方法可行,但不推薦,因為在編碼中沒有任何意義),如下所示:
~~~
let q = 1.1
console.log(q) // 1.1
let w = 0.1
console.log(w) // 0.1
let e = .1
console.log(e) // 0.1
~~~
> 由于保存浮點數值所需的內存空間是數值類型的兩倍,所以ECMAScript會在適當的時機將浮點類型轉為整數,比如小數點后面沒有數字的時候或者當小數點后面的數字為0的時候。
> 同時需要注意,由于計算機二進制與十進制精度問題,所有的計算機語言的浮點類型都會有計算誤差,所以建議永遠不要去測試或者深度使用浮點值進行編碼
#### 數值范圍
> 由于內存的限制,ECMAScript并不能保存世界上所有的數值,在大多數javascript運行環境中,ECMAScript能表示的最小數值都保存在Number.MIN_VALUE中,這個值是5e-324,在大多數javascript運行環境中,能夠表示的最大值保存在Number.MAX_VALUE中,這個值是1.7976931348623157e+308。
#### NaN
> NaN即非數值(Not a Number),是一個特殊值,這個數值用語表示一個本來要返回數值的操作未返回數值的情況,例如在編程語言中任何數值除以非數值都會導致這種錯誤,從而停止代碼執行,但在ECMAScript中,任何數值除以非數值的都會返回NaN,因此不會影響代碼執行。
>
> NaN本身有兩個特點:
首先,任何涉及NaN的操作都會返回NaN,如下所示:
~~~
console.log(NaN/1) // NaN
~~~
>其次,NaN與任何值都不相等,包括他自己,因此ECMAScript定義了isNaN()函數,這個函數接受一個參數,這個參數可以是任何類型,而這個函數會幫我們判斷這個參數是否“**不是數值**”,isNaN()在接受到一個參數后會嘗試將這個參數轉為數值,之后再判斷這個參數轉換后值是否是數值,如果不是數值它將返回true,如果是數值將會返回false,如下所示:
~~~
console.log(isNaN(10)) // false
console.log(isNaN("10")) // false
console,log(isNaN(NaN)) // true
console.log(isNaN("blue")) //true
~~~
#### 數值轉換
> 有三個函數可以將非數值轉換為數值:Number() , parseInt() , parseFloat()。
> 由于Number()函數在轉換字符串時比較復雜而且操作不合理,所以推薦使用parseInt()函數來替換Number()函數, parseInt()函數具體使用方式如下:
~~~
let num1 = parseInt("458456hgg")
console.log(num1) //458456
let num2 = parseInt("")
console.log(num2) //NaN
let num3 = parseInt(22.5)
console.log(num3) //22
let num4 = parseInt("10")
console.log(num4) // 10 (十進制)
let num5 = parseInt("0xa")
console.log(num5) // 10(十六進制)
let num6 = parseInt("070")
console.log(num6) // 56 (八進制)
~~~
> 如上所示, parseInt() 在轉換字符串時會判斷字符串中是否含有數字,如果是數字與字符串的拼接,那么它將提取參數中數字部分進行轉換,如果參數是空字符串,那么將返回NaN,如果參數含有小數點,那么將提取小數點前的整數進行返回,如果參數是二進制/八進制/十進制/十六進制的字符,那么將直接返回參數值。
> 但是大多時候我們都是想要將參解析為十進制的數值,為避免parseInt()解析錯誤,我們可以微 parseInt() 傳入第二個參數,指定它的解析類型,代碼如下:
~~~
let num1 = parseInt("10",2) //解析為二進制
console.log(num1) // 2
let num2 = parseInt("10",8) //解析為八進制
console.log(num2) // 8
let num3 = parseInt("10",10) //解析為十進制
console.log(num3) // 10
let num4 = parseInt("10",16) //解析為十六進制
console.log(num4) // 16
~~~
> 強烈建議大家在使用parseInt()時將第二個參數設定為10
> parseFloat()與parseInt()類似,也是從參數的第一個字符串開始解析每個字符,一直解析到末尾,或者解析道遇到一個無效的浮點數字字符為止,也就是說參數字符串中第一個小數點是有效的,第二個小數點是無效的,因此第二個小數點后面的字符串將被忽略,代碼如下:
~~~
let num1 = parseFloat("123rtirt")
console.log(num1) // 123
let num2 = parseFloat("0xa")
console.log(num2) // 0
let num3 = parseFloat("12.1")
console.log(num3) // 12.1
let num4 = parseFloat("23.24.25.26")
console.log(num4) // 23.24
let num5 = parseFloat("032.1")
console.log(num5) // 32.1
~~~
> 在ES6中提供了Number.isInteger()用來判斷一個值是否為整數。需要注意的是,在JavaScript內部,整數和浮點數是同樣的儲存方法,所以3和3.0被視為同一個值。代碼如下:
~~~
Number.isInteger(25) // true
Number.isInteger(25.0) // true
Number.isInteger(25.1) // false
Number.isInteger("15") // false
Number.isInteger(true) // false
~~~
#### 數值格式化
>