JS基础-数据类型-数值
源链接:https://wangdoc.com/javascript/types/number.html#整数和浮点数
存储
JS中所有的数值都是浮点型(小数),都是以64位浮点数形状储存,整数也是这样。但某些运算需要整数才能完成,所以JS再这时候会自动将64位浮点型转成32位整数型,具体格式后面说。
根据国际标准 IEEE 754,数值以科学计数法的形式表示(a×2^n)
,存储的64位从左往右会被分为3部分:正负标识部分、指数部分、小数部分。
- 正负标识:1位,标志数值的正负,0为负数,1为整数。
- 指数部分:11位,表示数值的大小,即上式a。
- 小数部分:52位,表示数值的精确值,即上式n。
范围
指数范围
11位二进制的范围在[0, 2047]
之间,因为要分为正负两个部分,所以分为[+0, 1023]
, [-1023, -0]
两个区间,这里正负0代表意义意义,二进制不同。
这个范围就是11位指数的基本范围,但这里只是指数,数值的范围下面说。
小数范围
IEEE 754 规定,如果指数部分的值在0到2047之间(不含两个端点),那么有效数字的第一位默认总是1,不保存在64位浮点数之中。也就是说当指数在(0, 2047)
之间时,可以视小数部分位数为53位,且第一位固定为0。
也就是说小数部分的范围在[-2^53, 2^53]
之间,也就说在这个范围内的值都能精确表示。
由于2的53次方是一个16位的十进制数值,所以简单的法则就是,JavaScript 对15位的十进制数都可以精确处理。
数值整体范围
由指数范围可知[2^-1023, 2^1023]
在可选范围内。
再考虑小数部分范围在[-2^53, 2^53]
,这样因为范围远小于指数表示最大值所以对数值范围上限的影响是由22013(闭区间)变为21024(开区间)。而而小数最小范围与指数最小范围互不影响,使得数值范围的下限叠加,由2-1023(闭区间)变为2-1075(闭区间)。
由上数值的范围在[2^-1075, 2^1024)
之间。
JavaScript 提供Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
Math.pow(2, 1023) * 1.999999999999999 // 1.797693134862315e+308
Math.pow(2, 1024) // Infinity
Math.pow(2, -1075) // 5e-324
Math.pow(2, -1075) / 1.5 // 5e-324
数值的表示
科学计数法
以下科学记数法均有效
123e3 // 123000
123e-3 // 0.123
-3.1E+12
.1e-23
显示格式转换
以下两种情况下,JS会自动将数值转换为科学技术法的形式,其他都是字面之间展示
-
小数点前多于21位
1234567890123456789012
// 1.2345678901234568e+21123456789012345678901
// 123456789012345680000 -
小数点后的零多于5个
// 小数点后紧跟5个以上的零,
// 就自动转为科学计数法
0.0000003 // 3e-7// 否则,就保持原来的字面形式
0.000003 // 0.000003
数值进制
有十进制、八进制、十六禁止、二进制四种,具体如下
- 十进制:没有前导0的数值。
- 八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
- 十六进制:有前缀0x或0X的数值。
- 二进制:有前缀0b或0B的数值。
0开头的连接8以下数值也会解析位八进制,但容易误会建议不要这么用。使用范围外的字符会报错页不用说。
0xff // 255
0o377 // 255
0b11 // 3
特殊值
由上,数值范围在[2^-1075, 2^1024)
之间,大于这个范围的赋值会强制转变为Infinity,意为无穷。小于这个范围会被强制转为0。
+0和-0
JS内部分为正负两个0,两种只有一种情况不一样其他均可视为0,如下
-0 === +0 // true
0 === -0 // true
0 === +0 // true
+0 // 0
-0 // 0
(-0).toString() // '0'
(+0).toString() // '0'
(1 / +0) === (1 / -0) // false
NaN
表示“非数字”,主要出现在将字符串解析成数字出错的场合。
5 - 'x' // NaN
Math.acos(2) // NaN
Math.log(-1) // NaN
Math.sqrt(-1) // NaN
0 / 0 // NaN
typeof NaN // 'number'
NaN不等于任何值,包括自身。boolean运算时会被当作false,参与任何数值运算结果都为NaN
Infinity
意为无穷,具体如下
Math.pow(2, 1024) // Infinity
0 / 0 // NaN
1 / 0 // Infinity
Infinity === -Infinity // false
Infinity === Infinity // true
非零正数除以-0,会得到-Infinity,负数除以-0,会得到Infinity。
Infinity的一切数值运算等同于逻辑上的无穷。