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