JavaScript基本类型值-Number类型
大致介绍
在javascript的内部采用ieee754格式来表示数字,所以不区分整数和浮点数,都是用64位浮点数的形式储存。就是说,在javascript内部,就根本没有小数。但是有些运算必须得需要整数完成,所以javascript有时会把64位的浮点数转换成32位的整数,再进行运算。
整数
javascript对整数提供四种表示方法:
1、二进制:有前缀0b的数值,出现0,1以外的数字会报错
2、八进制:有前缀0o的数值,或者是以0后面再跟一个数字(0-7)。如果超出了前面所述的数值范围,则会忽略第一个数字0,视为十进制数
注意:八进制字面量在严格模式下是无效的,会导致支持该模式的javascript引擎抛出错误
3、十六进制:有前缀0x,后跟任何十六进制数字(0~9及a~f),字母大小写都可以,超出范围会报错
4、十进制
var num2 = 0b11; console.log(num2); //3 var num2 = 0b12; console.log(num2); //报错 var num8 = 0o76; console.log(num8); //02 var num8 = 0o78; console.log(num8); //报错 var num16 = 0x2a; console.log(num16); //42 var num16 = 0x2h; console.log(num16) //报错
浮点数
所谓浮点数,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。与整数不同,浮点数只能用十进制来表示
浮点数的精度远远不如整数,所以设计浮点数的运算好比较要小心
例如:
console.log(0.1 + 0.2 == 0.3); //false 0.30000000000000004 console.log(0.6/0.2); //2.9999999999999996
科学计数法
对于那些极大极小的数值,可以用e表示法(即科学计数法)表示的浮点数值表示。用e表示法表示的数值等于e前面的数值乘以10的指数次幂
以下两种情况,javascript会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示。
1、小数点前的数字多余21位
console.log(1234567890123456789012);// 1.2345678901234568e+21 console.log(123456789012365648787); //123456789012365660000
2、小数点后面的0多余5位
console.log(0.0000006);//6e-7 console.log(0.000006); //0.000006
数值范围
由于内存的限制,ecmascript并不能保存世界上所有的数值,所以就有了最大值和最小值
最小值保存在number.min_value中,这个值是5e-324
最大值保存在number.max_value,这个值是1.7976931348623157e+308
console.log(number.min_value) //5e-324 console.log(number.max_value); //1.7976931348623157e+308
如果数字超过最大值,javascript会返回infinity,这称为正向溢出(overflow);如果等于或超过最小负值-1023(即非常接近0),javascript会直接把这个数转为0,这称为负向溢出(underflow)
如果要想确定一个数值是不是有穷的,可以使用isfinite()函数。这个函数在参数位于最小与最大数值之间时会返回true
var result = number.max_value + number.max_value; console.log(isfinite(result)); //false
特殊数值
1、+0和-0
这两个0在大对数的情况下都是等价的
-0 === +0; //true 0 === -0; //true 0 === +0; //true
但是在作为分母的时候是不一样的
1/-0 == 1/+0; //false
2、infinity
infinity表示“无穷”,用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非0数值除以0,得到infinity。
math.pow(2,math.pow(2,100));//infinity 1/0;//infinity
infinity参与的运算结果只能是其本身、0或nan
* infinity;//infinity - infinity;//-infinity + infinity;//infinity / infinity;//0 infinity / 2;//infinity infinity * infinity;//infinity infinity - infinity;//nan infinity + infinity;//infinity infinity / infinity;//nan
3、nan
这个数值表示一个本来要返回数值的操作数未返回数值的情况
nan与任何值不相等,包括它本身,并且涉及nan的任何操作都会返回nan
5 - 'x'; //nan math.acos(2); //nan 0 / 0; //nan nan == nan;//false nan == infinity;//false
nan不是一种独立的数据类型,而是一种特殊数值,它的数据类型依然属于number
typeof nan; //number
isnan方法可以用来判断一个值是否为nan,但是,isnan只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成nan,所以最后返回true,这一点要特别引起注意。也就是说,isnan为true的值,有可能不是nan,而是一个字符串。
isnan('hello') // true // 相当于 isnan(number('hello')) // true
判断nan更可靠的方法是,利用nan是javascript之中唯一不等于自身的值这个特点,进行判断
function isnan(value){ return value != value; }
数制转换
有3个函数可以把非数值转换成数值:number()、parseint()和parsefloat()。其中number()可以将任意类型的值转化成数值,而parseint()和parsefloat()只应用于字符串向数字的转换
number()
转换规则:
1、如果是boolean值,true和false将分别转换为1和0
2、如果是null值,返回0
3、如果是undefined,返回nan
4、如果是字符串,遵循以下规则:
(1)若字符串只包含十进制或十六进制数字,则转成十进制的数字
注意:number()不识别八进制数字的字符串,会按照十进制数字处理
字符串'1.2.'不会报错,但数字1.2.会报错
(2)若字符串为空字符串或空格字符串,则转成0
(3)其他情况的字符串,则转成nan
number(true) //1 number(null) //0 number(undefined) //nan number("0123") //123 number("0x123") //291 number("0.2") //0.2 number("") //0 number("asd") //nan
parseint()
parseint()专门用于把字符串转换成整数。在转换字符串时,会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseint()就会返回nan。如果是,则继续解析,直到解析完成或者遇到非数字字符
console.log(parseint(' 123.8px'));//123 console.log(parseint(' 123.8 '));//123 console.log(parseint(' -123.8px'));//-123 console.log(parseint('a123.8px'));//nan console.log(parseint('0 123.8px'));//0
注意:在ecmascript5中,parseint()已经不具备解析八进制的能力。例如八进制“070”,会忽略前面的“0”,得到十进制的70
为了消除在使用parseint()函数时可能导致的上述困惑,可以为这个函数提供第二个参数:转换时使用的基数(多少进制)
parseint("070") //70 parseint("070",8) //56
parsefloat()
parsefloat()专门用于字符串转换浮点数。同样地,解析时会忽略字符串前面的空格,直到找到第一个非空格字符,然后一直解析到字符串末尾或一个无效的浮点数字字符为止
console.log(parsefloat(' 0123.px'));//123 console.log(parsefloat(' 123.px'));//123 console.log(parsefloat(' 123.1px'));//123.1 console.log(parsefloat(' 123.1.2px '));//123.1 console.log(parsefloat(' -123.0px'));//-123 console.log(parsefloat('.123.1px'));//0.123 console.log(parsefloat('0 123px'));//0
注意:parsefloat()只解析十进制,所以十六进制的字符串始终会被转换成0。因此也没有第二个参数用来指定基数
parsefloat("0xa") //0
注意:number('')的结果是0,parseint('')和parsefloat('')的结果是nan
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
下一篇: 如何将整个网页保存为图片?