前言
看书的时候看到了进制转换,不由得让我自己联系起我这种数学渣渣,转换个进制还要算半天,唉,从小到大数学就对我无情啊。而且我还老是忘记,只要不常用我就转头忘记,所以这里简单记录一下吧
数据类型
ECMAScript 有 6 种简单数据类型(也称原始类型):Undefined
, Null
, Number
, Boolean
, String
和 Symbol(符号)
。
Symbol
是 ECMAScript6 新增的。
还有一种复杂数据类型 Object(对象)
。
在 ECMAScript 中,所有值都可以用上述 7 种数据类型之一来表示。
这篇文章,就主要记录一下 Number 类型的几个进制转换。
不同的数值类型相应的也有不同的数值字面量格式
八进制、十六进制、二进制 转换 为十进制
1.十进制
最基本的数值字面量格式是十进制整数,直接写出来即可:
let num = 520; // 整数
复制代码
十进制整数也可以用八进制(以8为基数) 或 十六进制(以16为基数) 字面量表示。
2.八进制
对于八进制字面量,必须带前缀 0 ,然后是相应的八进制数字,数值是 0~7 。如果字面量中包含的数字超出了应有的范围,就会忽略前缀的 0,后面的数字序列会被当成十进制数,如下所示:
let num1 = 050; // 八进制的 40
let num2 = 080; // 无效的八进制值,当成 80 处理
let num3 = 09; // 无效的八进制值,当成 9 处理
复制代码
八进制 转 十进制 计算方式:
(个位数 乘以 8的0次方) + (十位数 乘以 8的1次方) + (百位数 乘以 8的2次方)... = 十进制得数
比如上面代码的 num1 = 050
,就是 0×8º + 5×8¹ + 0×8² = 40
同理,如果是 num4 = 052
,就是 2×8º + 5×8¹ + 0×8² = 42
- 除 0 以外, 任何数的 0 次方,都等于 1
- ECMAScript 2015 或 ES6 中的八进制值通过前缀 0o 来表示;严格模式下,前缀 0 会被视为语法错误,如果要表示
八进制值,应该使用前缀 0o
3.十六进制
十六进制字面量,前缀是0x(区分大小写),十六进制数字是 09 以及 AF。(ABCDEF表示的二进制数字分别是10,11,12,13,14,15)。十六进制数字中的字母大小写均可,如下所示:
let num1 = 0xA; // 十六进制 10
let num2 = 0x1f; // 十六进制 31
复制代码
十六进制 转 十进制 计算方式:
(个位数 乘以 16的0次方) + (十位数 乘以 16的1次方) + (百位数 乘以 16的2次方)... = 十进制得数
比如上面代码的 num2 = 0x1f
,就是 15×16º + 1×16¹ = 31
4.二进制
二进制字面量,数值只有 0 和 1,es6中新增了二进制字面量的表示,以 0b
开头,如下所示:
let num1 = 0b101; // 二进制 5
let num2 = 0b10011; // 二进制 19
复制代码
二进制 转 十进制 计算方式:
(个位数 乘以 2的0次方) + (十位数 乘以 2的1次方) + (百位数 乘以 2的2次方)... = 十进制得数
比如上面代码的 num1 = 0b101
,就是 1×2º + 0×2¹ + 1×2² = 5
同理 num2 = 0b10011
,你可以计算一下转换成十进制是多少
十进制 转 二进制、八进制、十六进制
1.十进制转二进制
采用 除2取余,逆序排列 法
① 十进制数值 除以 2,得到 商 和 余数
② 得到的商 再除以 2,又得到一个 商 和 余数
-- 重复上面的操作,直到得到的商 等于 0 为止
③ 然后把所得的所有余数排列起来,进行逆序排列
例如: 89 转换成 二进制 等于多少?
89 ÷ 2 = 44 | 余 1
44 ÷ 2 = 22 | 余 0
22 ÷ 2 = 11 | 余 0
11 ÷ 2 = 5 | 余 1
5 ÷ 2 = 2 | 余 1
2 ÷ 2 = 1 | 余 0
1 ÷ 2 = 0 | 余 1
复制代码
所得到的所有余数是: 1 0 0 1 1 0 1
对所有余数进行逆序排序,最后结果就是:1011001,那么 89 转换成二进制,就等于 1011001
2.十进制转八进制
采用 除8取余,逆序排列 法
计算过程与上述 十进制转二进制 是差不多的
例如: 21 转换成 八进制 等于多少?
21 ÷ 8 = 2 | 余 5
2 ÷ 8 = 0 | 余 2
复制代码
所得到的所有余数是:5 2
对所有余数进行逆序排序,最后结果就是:25,八进制以 0 开头,那么 21 转换成 八进制 ,结果就等于 025
3.十进制转十六进制
采用 除16取余,逆序排列 法
计算过程与上述 十进制转二进制 是差不多的
例如: 67 转换成 十六进制 等于多少?
67 ÷ 16 = 4 | 余 3
4 ÷ 16 = 0 | 余 4
复制代码
所得到的所有余数是:3 4
对所有余数进行逆序排序,最后结果就是:43,十六进制前缀是 0x,那么 67 转换成 十六进制 ,结果就等于 0x43
对前端来讲,进制转换貌似用到的不是很多,但是简单了解一下还是很好的
好了,关于进制的转换记录就到这里吧,下面是关于浮点值的扩展记录❤
扩展记录:
说说浮点值:浮点值,数值中必须包含小数点,而且小数点后面必须至少有一个数字。虽然小数点前面不是必须有整数,但是推荐加上,如下所示:
let floatNum1 = 5.2;
let floatNum1 = 0.2;
let floatNum1 = .2; // 有效,但不推荐
复制代码
因为存储浮点值使用的内存空间是存储整数值的两倍,所以 ECMAScript 总是想方设法把值转换为 整数。
在小数点后面没有数字的情况下,数值就会变成整数。类似地,如果数值本身就是整数,只是小数点后面跟着 0(如 6.0),那它也会被转换为整数,如下所示:
let floatNum1 = 5.; //小数点后面没有数字,当做整数 5 处理
let floatNum1 = 6.0; // 小数点后面是 0,当做整数 6 处理
复制代码
对于特别大或者特别小的数值,浮点值可以用科学计数法表示。
科学计数法是指把一个数表示成a与10的n次幂相乘的形式
格式要求是一个数值(整数或浮点数)后跟一个大写或小写的字母 e,再加上一个要乘的 10 的多少次幂。比如:
let floatNum = 5.21e7; // 等于 52100000
复制代码
let floatNum = 5.21e7
意思就是说,以5.21作为系数,乘以 10 的 7 次幂,这样的计数法显得更加简洁
遇到非常小的数值,比如 0.000000002,这个数值用科学计数法可以表示为 2e-9
默认情况下,ECMAScript 会将小数点后至少包含 6 个零的浮点值转换为科学记数法
例如,0.000 000 3 会被转换为 3e-7
浮点值的精确度
浮点值的精确度最高可达 17 位小数,但在算术计算中远不如整数精确。
例如,0.1 加 0.2 得到的不是 0.3,而是 0.300 000 000 000 000 04。
这种微小的错误,导致很难测试特定的浮点值,比如:
if (a + b == 0.3) { // 不要这么去写!
console.log("结果: 0.3.");
}
复制代码
这里检测两个数值之和是否等于 0.3。如果两个数值分别是 0.05 和 0.25,或者 0.15 和 0.15, 那没问题。但如果是 0.1 和 0.2,如上所述,测试将失败。因此永远不要测试某个特定的浮点值