简单了解进制转换--二进制、八进制、十六进制

前言

看书的时候看到了进制转换,不由得让我自己联系起我这种数学渣渣,转换个进制还要算半天,唉,从小到大数学就对我无情啊。而且我还老是忘记,只要不常用我就转头忘记,所以这里简单记录一下吧

数据类型

ECMAScript 有 6 种简单数据类型(也称原始类型):Undefined, Null, Number, Boolean, StringSymbol(符号)

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.二进制

二进制字面量,数值只有 01,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。

kexuejishufa.png

这种微小的错误,导致很难测试特定的浮点值,比如:

if (a + b == 0.3) { // 不要这么去写! 
 console.log("结果: 0.3."); 
}
复制代码

这里检测两个数值之和是否等于 0.3。如果两个数值分别是 0.05 和 0.25,或者 0.15 和 0.15, 那没问题。但如果是 0.1 和 0.2,如上所述,测试将失败。因此永远不要测试某个特定的浮点值

本篇文章就到这里结束了,谢谢你的耐心阅读❤

おすすめ

転載: juejin.im/post/7047678335018598408