### 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
~~~
#### 数值格式化
>