导航
将二进制的 101011
转换为十进制的步骤如下:
1 * 2 ^ 0 = 1;
1 * 2 ^ 1 = 2;
0 * 2 ^ 2 = 0;
1 * 2 ^ 3 = 8;
0 * 2 ^ 4 = 0;
1 * 2 ^ 5 = 32;
八进制就是逢 8 进 1 ,八进制数采用 0~7
这八数来表达一个数
将八进制的 (53)O 转换为十进制的步骤如下:
3 * 8 ^ 0 = 3;
5 * 8 ^ 1 = 40;
十六进制就是逢 16 进 1 ,十六进制的 16 个数为 0123456789ABCDEF。
将十六进制的 (2B)H 转换为十进制的步骤如下:
B x 16 ^ 0 = 11;
(从 9 往后,A是10,B是11)2 x 16 ^ 1 = 32;
除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。
将十进制的 43
转换为二进制的步骤如下:
整数十进制转二进制已经知道了,再来看看小数是怎么转二进制的,小数部分的转换不同于整数部分,它采用的是乘 2 取整法 ,将十进制中的小数部分乘以 2 作为二进制的一位,然后继续取小数部分乘以 2 作为下一位,直到不存在小数为止。
以 8.625
转二进制作为例子:
8 % 2
→ 商 4
余 0
4 % 2
→ 商 2
余 0
2 % 2
→ 商 1
余 0
1 % 2
→ 商 0
余 1
0.625 * 2
→ 1.25
取整 1
0.25 * 2
→ 0.5
取整 0
0.5 * 2
→ 1
取整 1
1000.101
但并不是所有小数都可以用二进制表示,上边的 0.625
小数是一个特例,刚好通过乘 2 取整法的方式完整的转换成二进制。
接下来我们看看 0.1
的例子:
0
0.1 * 2
→ 0.2
取整 0
0.2 * 2
→ 0.4
取整 0
0.4 * 2
→ 0.8
取整 0
0.8 * 2
→ 1.6
取整 1
0.6 * 2
→ 1.2
取整 1
0.2 * 2
→ 0.4
取整 0
0.4 * 2
→ 0.8
取整 0
0.8 * 2
→ 1.6
取整 1
0.6 * 2
→ 1.2
取整 1
0.2 * 2
→ 0.4
取整 0
可以发现, 0.1
的二进制表示是无限循环的。
由于计算机的资源是有限的,所以是没办法用二进制精确的表示 0.1,只能用「近似值」来表示,就是在有限的精度情况下,最大化接近 0.1 的二进制数,于是就会造成精度缺失的情况。
除8取余法,即每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。
将十进制的(796)D转换为八进制的步骤如下:
除16取余法,即每次将整数部分除以16,余数为该位权上的数,而商继续除以16,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。
将十进制的(796)D转换为十六进制的步骤如下:
toString
使用 toString
方法:
function decimalToBaseN(decimalNumber, base) {
if (base < 2 || base > 36) {
throw new Error("Base must be between 2 and 36");
}
return decimalNumber.toString(base);
}
// 示例:将十进制数 123 转换为二进制
console.log(decimalToBaseN(123, 2)); // 输出: "1111011"
// 示例:将十进制数 123 转换为十六进制
console.log(decimalToBaseN(123, 16)); // 输出: "7b"
parseInt
使用 parseInt
方法:
function baseNToDecimal(baseNNumber, base) {
if (base < 2 || base > 36) {
throw new Error("Base must be between 2 and 36");
}
return parseInt(baseNNumber, base);
}
// 示例:将二进制数 "1111011" 转换为十进制
console.log(baseNToDecimal("1111011", 2)); // 输出: 123
// 示例:将十六进制数 "7b" 转换为十进制
console.log(baseNToDecimal("7b", 16)); // 输出: 123
联想平常颜色的十六进制 #00ff00
是包含字母的
所以如果是想 n 进制转十进制,那么这个 n 就有可能包含字母,包含字母就得是字符串去转数字,那么就是 parseInt() 方法,因为它接收的第一个参数是字符串。
反过来如果是十进制转 n 进制,那么就得用 toString 了,因为转换后的进制不一定是个数字