整数部分的十进制和二进制转换很容易,下面我们只考虑小数部分的转化:
一、十进制小数转二进制
小数部分十进制小数乘以 2,得出的积,然后把积的整数位取出,再用积的小数部分乘以 2,再把积的整数位取出,再用小数部分乘以 2,循环操作,直到小数部分为 0,或者遇到无限循环,取到你认为足够精度的小数为止,然后把取出的整数位顺序连接起来,就是要转换成的二进制小数。
例如:
0.125的十进制转换成二进制形式
计算 | 取整数部分 |
0.125*2=0.25 | 0 |
0.25*2=0.5 | 0 |
0.5*2=1 | 1 |
所以:
0.125的二进制形式为0.001
比如:0.4 要转换成二进制数
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.4* 2= 0.8取整数位0
0.8* 2= 1.6取整数位1
......
这样就会无限循环下去,小数部分也不会为 0。那就取一个你认为合适的精度。
0.0110011001
= 0.39941406 //无限接近0.4
这样看来,最末尾的数字如果不是5,最后的都只能根据所需精度取近似值。
二、二进制小数转换成十进制
从二进制小数部分的左边第一位开始,由高位到低位,依次乘以 2 的 -1 次方,2 的 -2 次方,2的 -3 次方... 最后把所有的结果相加,就是要转换的十进制小数。
第1位*1/2 (即0.5)
第2位*1/4 (即0.25)
第3位*1/8 (即0.125)
第4位*1/16 (即0.0625)
.
.
.
.
例如:
0.001的二进制转换成十进制数
位数 | 位值 | 计算 | 结果 | 加和 |
1 | 0 | 0*0.5=0 | 0 | |
2 | 0 | 0*0.25=0 | 0 | |
3 | 1 | 1*0.125=0.125 | 0.125 | 0.125 |
例如:
0.1011的二进制转换成十进制数
位数 | 位值 | 计算 | 结果 | 加和 |
1 | 1 | 1*0.5=0.5 | 0.5 | |
2 | 0 | 0*0.25=0 | 0 | |
3 | 1 | 1*0.125=0.125 | 0.125 | |
4 | 1 | 1*0.0625=0.0625 | 0.0625 | 0.6875 |
所以
1位小数的精度是 2^-1 =0.5
2位小数的精度是 2^-2 =0.25
3位小数的精度是 2^-3 =0.125
4位小数的精度是 2^-4 =0.03125
5位小数的精度是2^-5 =0.015625
所以你希望精度是0.1,或者0.01都是做不到的,那样只能取近似值;
三、小数十进制转换为16进制
小数部分十进制小数乘以16,得出的积,然后把积的整数位取出,再用积的小数部分乘以16,再把积的整数位取出,再用小数部分乘以 16,循环操作,直到小数部分为 0,或者遇到无限循环,取到你认为足够精度的小数为
止,然后把取出的整数位顺序连接起来,就是要转换成的16进制小数。
0.125的十进制转换成16进制形式:
0.125* 16= 2取整数位2
0.125的十六进制形式为0.2
考虑前面0.125计算出来的二进制形式为0.001,我们四位一组补齐,那么0.125的二进制形式为0.0010,整数中的二进制0010B=2H,这样直接就得到了16进制的0.2;
再举一例测试:十进制的0.375分别转换成二进制数和十六进制数分别是:
1、按十到二进制转换方法计算得出0.375的二进制表示为:0.011
2、按十到二进制转换方法计算得出0.375的二进制表示为:0.6
我们将0.375的二进制结果末尾0.011补0凑成四位,则得到0.375的二进制表示为0.0110,于是根据整数二进制十六进制转换方法得到0.375的十六进制结果为0.6;
于是得到小数二进制和十六进制的转换方式和整数部分是相同的,二进制往右补0,补齐4位,8位,12位等4的倍数位数即可;
再用前面的0.4为例计算:
0.4*16= 6.4取整数位6
0.4* 16= 6.4取整数位6
0.4* 16= 6.4取整数位6
......
这样会无限循环下去…我们取两位得到0.4的十六进制结果是0.66,按三中的分析方法,直接得到0.4二进制结果是0.01100110。这和前面利用十进制转二进制方法的得到的结果是一致的。
由此推广到所有小数的进制互换,二进制,八进制,十进制,十六进制表示方法之间的相互转换,顿时豁然。
2022年8月5日 长沙