Number数据类型使用IEEE754格式来表示整数和浮点数值。
为了支持各种数值类型,ECMA-262定义了不同的数值字面量格式。
- 十进制:最基本的数值字面量,直接在代码里输入。
var intNum=55;
- 八进制:在严格模式下是无效的,第一位必须是零(0),然后是八进制数字序列(0~7),如果字面值中的数值超出了范围,那么前导零将会被忽略,后面的数值被当作十进制数解析。
var octa1Num1=070; //八进制的56
var octa1Num2=079; //无效的八进制数------解析为79
var octa1Num3=08; //无效的八进制数-----解析为8
- 十六进制:字面值的前两位必须是0x,后跟任何十六进制数字(0-9及A-F),其中,字母A-F可以大写也可以小写。
var hexNum1=0xA; //十六进制的10
var hexNum2=0x1f; //十六进制的31
在进行算数运算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值。
浮点数
所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字,小数点前面 可以没有整数,但是我们不推荐这种写法。浮点数只能用十进制数表示。
var floatNum1=1.1;
var floatNum2=0.1;
var floatNum1=.1; //有效但不推荐
由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转换为整数值。例如:
var floatNum1= 1. //小数点后没有数值---解析为1
var floatNum2=10.0 //整数,解析为10
对于极大极小的数值可以使用科学计数法,用e表示法表示的数值等于e前面的数值乘以10的e后面数值次幂。
console.log(3.14e7==31400000) //true
浮点数只能用十进制数表示,浮点数的最高精度是17位小数,但在进行算数运算时其精确度远远不如整数。例如0.1+0.2的结果不是0.3,而是0.30000000000000004.
数值范围
由于内存的限制,ECMAScript并不能保存世界上所有的数值,所以就有了最大值和最小值:
最小值保存在Number.MIN_VALUE中,这个值是5e-324;
最大值保存在Number.MAX_VALUE中,这个值是1.7976931348623157e+308
超出该范围则会转换为Infinity或0.
console.log(Number.MAX_VALUE);//1.7976931348623157e+308
console.log(Number.MIN_VALUE);//5e-324
console.log(2.7976931348623157e+308)//infinity
console.log(5e-325)//0
使用isFinite()函数判断一个数值是否有穷,若是,则返回true;
var result=Number.MAX_VALUE+Number.MAX_VALUE;
console.log(isFinite(result)); //false
数值转换
有三个函数可以把非数值转换为数值:Number(),paseInt()和parseFloat()。其中,Number可以用于任何数据类型,而另外两个函数专门用于把字符串转化成数值。
1.Number()
转换规则:
如果是Boolean值,true和false将分别转换为1和0
如果是null值,返回0
如果是undefined,返回NAN
如果是字符串,遵循以下规则:
(1)若字符串只包含十进制或十六进制数字,则转成十进制的数字
注意:Number()不识别八进制数字的字符串,会按照十进制数字处理
(2)若字符串为空字符串或空格字符串,则转成0
(3)其他情况的字符串,则转成NaN
var num1 = Number(true);//1
var num2 = Number(false);//0
var num3 = Number(null);//0
var num4 = Number(undefined);//NaN
var num5 = Number("1.32");//1.32
var num6 = Number(1.32);
var num7 = Number("");//0
var num8 = Number("hi");//NaN
2.parseInt( )
parseInt()专门用于把字符串转换成整数,在转换字符串时,会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN。如果是,则继续解析,直到解析完成或者遇到非数字字符.
console.log(parseInt("123blue"));//123
console.log(parseInt(""));//NaN
console.log(parseInt("0xA"));//10
console.log(parseInt("123.456"));//123
console.log(parseInt("070"));//70不解析八进制
注意:在ECMAScript5中,parseInt()已经不具备解析八进制的能力。例如"070’,会忽略前面的‘0’,得到十进制的70。为了消除在使用parseInt()函数时可能导致的上述困惑,可以为这个函数提供第二个参数:第一个参数的基底(第一个参数是什么进制?),然后parseInt()函数将第一个参数转换为十进制整数。
console.log(parseInt("70",8));//56
console.log(parseInt("70",16))//112
console.log(parseInt("70",10))//70
3.parseFloat()
parseFloat( )专门用于字符串转换浮点数。同样地,解析时会忽略字符串前面的空格,直到找到第一个非空格字符,然后一直解析到字符串末尾或一个无效的浮点数字字符为止
需要注意的两点:
- parseFloat( )始终会忽略前导的零,所以parseFloat( )只解析十进制,且无第二个参数;
2.parseFloat( )若遇到一个可解析为整数的数,则会返回整数。
console.log(parseFloat("123blue"));//123
console.log(parseFloat("22.5"));//22.5
console.log(parseFloat("22.5.7"));//22.5
console.log(parseFloat("022.5"));//22.5
console.log(parseFloat("25.0"));//25
NaN(非数值)
NaN即为非数值,这个数值表示一个本来要返回数值的操作数的情况,NaN具有两个特点:
- 任何涉及NaN的操作都会返回NaN;
- NaN与任何数值都不相等,包括NaN本身。
console.log(10/NaN); //NaN
console.log(NaN == NaN); //false
isNaN()函数用来判断参数是否”不是数值“,isNaN()在接收到一个值后,会尝试将这个值转换为数值,任何不能转换为数值的值都会返回true。
console.log(isNaN(NaN)); //true
console.log(isNaN(10)); //false
console.log(isNaN("10")); //false
console.log(isNaN(true)); //false
console.log(isNaN(null)); //false
console.log(isNaN("blue")); //true