【转载】十进制小数转二进制小数方法

十进制小数转二进制小数方法

 

十进制小数→→→→→二进制小数 方法:“乘2取整”

对十进制小数乘2得到的整数部分和小数部分,整数部分既是相应的二进制数码,再用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分.
如此不断重复,直到小数部分为0或达到精度要求为止.第一次所得到为最高位,最后一次得到为最低位
如:0.25的二进制
0.25*2=0.5  取整是0
0.5*2=1.0    取整是1
即0.25的二进制为 0.01 ( 第一次所得到为最高位,最后一次得到为最低位)

0.8125的二进制

0.8125*2=1.625   取整是1

0.625*2=1.25     取整是1

0.25*2=0.5       取整是0

0.5*2=1.0        取整是1

即0.8125的二进制是0.1101(第一次所得到为最高位,最后一次得到为最低位)

 

十进制小数→→→→→八进制小数 方法:“乘8取整” 

0.71875)10 =(0.56)8

 

0.71875*8=5.75  取整5

0.75*8=6.0      取整6
即0.56

十进制小数→→→→→十六进制小数方法:“乘16取整”例如: 

(0.142578125)10=(0.248)16

 

0.142578125*16=2.28125  取整2

0.28125*16=4.5          取整4

0.5*16=8.0              取整8

即0.248

写个纯十进制小数转换十六进制的函数:

Delphi(Pascal) code

 

function HexFloat(f: Double): String;

begin

  Result := '0';

  if f > 1E-99 then

  begin

    Result := Result + '.';

    while f > 1E-99 do

    begin

      f := f * 16;

      Result := Result + IntToHex(Trunc(f), 1);

      f := f - Trunc(f);

    end;

  end;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  ShowMessage (HexFloat(0.142578125));

end;

 

 

非十进制数之间的转换 

(1)二进制数与八进制数之间的转换 

转换方法是:以小数点为界,分别向左右每位二进制数合成一位八进制数,或每一位八进制数展成三位二进制数,不足三位者补0。例如: 

(423。45)8=(100 010 011.100 101)2 

(1001001.1101)2=(001 001 001.110 100)2=(111.64)8 

(2)二进制与十六进制转换 

转换方法:以小数点为界,分别向左右每位二进制合成一位十六进制数,或每一位十六进制数展成四位二进制数,不足四位者补0。例如: 

(ABCD。EF)16=(1010 1011 1100 1101.1110 1111)2 

(101101101001011.01101)2=(0101 1011 0100 1011.0110 1000)2=(5B4B。68)16

<think>我们参考引用[2]和引用[3]中的方法,将十进制小数部分换为二进制小数方法是:乘2取整法。 具体步骤如下: 1. 将十进制小数部分乘以2,得到乘积。 2. 记录乘积的整数部分(0或1),作为二进制小数当前位的值。 3. 取乘积的小数部分作为新的小数。 4. 重复上述步骤,直到小数部分为0或达到所需的精度。 5. 将记录的整数部分按顺序排列(最先得到的整数部分为最高位)。 注意:有时小数部分可能永远不会为0,这时需要根据精度要求决定停止点。 举例:将0.625换为二进制小数。 步骤1:0.625 × 2 = 1.25,整数部分为1,小数部分为0.25 步骤2:0.25 × 2 = 0.5,整数部分为0,小数部分为0.5 步骤3:0.5 × 2 = 1.0,整数部分为1,小数部分为0 停止,因为小数部分已经为0。 将整数部分按顺序排列:先得到的1为第一位,接着0,最后1,所以二进制小数为0.101。 再举一个例子:0.71875(引用[2]的例子) 0.71875 × 2 = 1.4375 -> 整数1,小数0.4375 0.4375 × 2 = 0.875 -> 整数0,小数0.875 0.875 × 2 = 1.75 -> 整数1,小数0.75 0.75 × 2 = 1.5 -> 整数1,小数0.5 0.5 × 2 = 1.0 -> 整数1,小数0 所以二进制小数为0.10111。 如果十进制数既有整数又有小数,则分别换整数部分和小数部分,然后用小数点连接。 例如:3.25(引用[3]的例子) 整数部分3:二进制为11 小数部分0.25:0.25×2=0.5(整数0),0.5×2=1.0(整数1) -> 0.01 所以3.25的二进制为11.01 注意:在计算机中,二进制表示有时是循环的,例如0.1(十进制换为二进制: 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 0.6 × 2 = 1.2 -> 整数1,小数0.2 0.2 × 2 = 0.4 -> 整数0 ... 开始循环 所以0.1(十进制) = 0.0001100110011...(二进制) 循环节为0011。 因此,在换时,如果遇到循环,则根据精度要求截断。 总结步骤: 1. 将十进制小数乘以2,得到乘积。 2. 取乘积的整数部分(0或1)作为二进制的一位。 3. 取乘积的小数部分作为新的小数。 4. 重复1-3,直到小数部分为0或达到所需位数。 5. 按顺序排列整数部分(最先得到的为最高位,即小数点后第一位)。 现在,我们用一个流程图来概括: ``` 开始 | v 小数部分乘以2 --> 得到乘积(包含整数部分和小数部分) | v 取整数部分(0或1)作为二进制的一位 | v 取乘积的小数部分作为新的小数 | v 判断:新的小数是否为0或达到精度? --> 是 --> 结束 | 否 | | ------------------------------ ``` 最后,将得到的二进制位按顺序排列(最先得到的整数部分排在前面)。 注意:在换过程中,如果小数部分出现循环,则停止在所需的精度上。 下面,我们用一个具体的例子(0.3)来演示: 0.3 × 2 = 0.6 -> 整数0,小数0.6 0.6 × 2 = 1.2 -> 整数1,小数0.2 0.2 × 2 = 0.4 -> 整数0,小数0.4 0.4 × 2 = 0.8 -> 整数0,小数0.8 0.8 × 2 = 1.6 -> 整数1,小数0.6 (这里小数0.6重复出现,进入循环) 0.6 × 2 = 1.2 -> 整数1,小数0.2 (重复第二步) 所以0.3(十进制) = 0.0100110011...(二进制) 循环节为“0011”从第二位开始循环?实际上,我们重新计算时发现循环是从第二步开始的:0.0100110011...,但更准确地说,从第一次得到0.6开始循环,即0.0100110011...,循环节是“0011”吗?实际上,我们重新排列: 第一位:0(0.3×2得到0.6,整数0) 第二位:1(0.6×2得到1.2,整数1,小数0.2) 第三位:0(0.2×2得到0.4,整数0) 第四位:0(0.4×2得到0.8,整数0) 第五位:1(0.8×2得到1.6,整数1,小数0.6) 第六位:1(0.6×2得到1.2,整数1,小数0.2) 这里开始重复第二步 所以循环节应该是从第二位开始的“1001”?不对,因为第二步是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)... 所以循环节应该是“1001”吗?但是第五位开始又出现了0.6,所以循环节应该是从第一位0之后开始:1001循环?不对,因为第二步得到1,第三步得到0,第四步得到0,第五步得到1,然后第六步又是1(因为0.6×2=1.2,整数1),但这里0.6是之前出现过的,所以循环节应该是从第二步开始的“1001”吗?但是第六步得到1,而第二步也是1,但第三步是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)与第二步相同。所以循环节是“1001”重复?但是第二步和第六步都是1,而第三步和第七步都是0,第四步和第八步都是0,第五步和第九步都是1,所以循环节应该是“1001”吗?不对,因为第二步是1,第三步是0,第四步是0,第五步是1,然后第六步是1(对应0.6×2),第七步是0(0.2×2),第八步是0(0.4×2),第九步是1(0.8×2),第十步是1(0.6×2)... 所以从第二步开始,序列是:1,0,0,1,1,0,0,1,1,... 这里循环节应该是“1001”吗?但是第五位是1,第六位是1,然后第七位0,第八位0,第九位1,第十位1,所以实际上是“1001”重复?不对,因为第五位是1,第六位是1,然后第七位0,第八位0,第九位1,第十位1,所以循环节是“1100”?不对,因为第二步是1,第三步0,第四步0,第五步1,然后第六步1(对应0.6×2,与第二步相同),第七步0(与第三步相同),第八步0(与第四步相同),第九步1(与第五步相同),第十步1(与第六步相同)... 所以循环节是“1001”重复?但是第二步是1,第三步0,第四步0,第五步1,然后第六步1(这是新的循环的开始?)但实际上,第二步和第六步都是相同的操作(0.6×2)得到整数1,所以循环节应该是从第二步开始每4位重复:1001? 但第二步是1,第三步0,第四步0,第五步1(0.8×2得到1.6,整数1,小数0.6),然后第六步又是1(0.6×2得到1.2,整数1,小数0.2)... 所以实际上,从第二步开始,序列是:1,0,0,1,1,0,0,1,1,0,0,1,... 即每4位重复:1001,1001,1001... 但第五位是1,第六位是1,第七位0,第八位0,第九位1,第十位1,所以实际上是“1001”重复?不对,因为第五位是1(第五步),第六位是1(第六步),第七位0(第七步),第八位0(第八步),第九位1(第九步),第十位1(第十步)... 所以循环节应该是“1100”?不对,因为第二步是1,第三步0,第四步0,第五步1,第六步1,第七步0,第八步0,第九步1,第十步1... 所以循环节是4位:1001,1001,... 但是第五步的1和第六步的1是连续的,而第二步的1和第三步的0是连续的,所以循环节应该是“1001”重复,即每4位重复:1001 1001 1001 ... 但是第二步到第五步:1,0,0,1(这4位),然后第六步到第九步:1,0,0,1(这4位),但第六步的1和第五步的1是连续的,所以实际上序列是:0(第一位), 1,0,0,1, 1,0,0,1, 1,0,0,1,... 所以循环节是“1001”重复,但第一个循环从第二位开始,即小数点后第一位是0,然后第二位开始是循环节1001重复。 因此,0.3的二进制表示为0.0100110011001...(其中“1001”循环) 所以,在换时,如果遇到循环,我们通常会在达到一定精度后停止,比如保留8位二进制小数:0.01001100(8位)或0.010011001(9位)等。 现在,我们总结方法十进制小数部分二进制小数:乘2取整法,直到小数部分为0或达到所需精度(可能无限循环)。 代码实现思路(伪代码): function decimalFractionToBinary(fraction, max_bits=20): binary = "0." count = 0 while fraction > 0 and count < max_bits: fraction *= 2 if fraction >= 1: binary += "1" fraction -= 1 # 取小数部分 else: binary += "0" count += 1 return binary 注意:这个函数可能会因为循环而无法停止,所以设置最大位数max_bits。 例如:0.625 -> 调用函数: 初始:fraction=0.625, binary="0." 第一步:0.625*2=1.25 -> 大于等于1,所以加"1",然后fraction=1.25-1=0.25 -> binary="0.1" 第二步:0.25*2=0.5 -> 小于1,加"0", fraction=0.5 -> binary="0.10" 第三步:0.5*2=1.0 -> 大于等于1,加"1", fraction=1.0-1=0 -> binary="0.101" 然后fraction为0,停止,结果为0.101 0.3:调用函数(max_bits=10): 0.3*2=0.6 -> 0, binary="0.0", fraction=0.6 0.6*2=1.2 -> 1, binary="0.01", fraction=0.2 0.2*2=0.4 -> 0, binary="0.010", fraction=0.4 0.4*2=0.8 -> 0, binary="0.0100", fraction=0.8 0.8*2=1.6 -> 1, binary="0.01001", fraction=0.6 0.6*2=1.2 -> 1, binary="0.010011", fraction=0.2 0.2*2=0.4 -> 0, binary="0.0100110", fraction=0.4 0.4*2=0.8 -> 0, binary="0.01001100", fraction=0.8 0.8*2=1.6 -> 1, binary="0.010011001", fraction=0.6 0.6*2=1.2 -> 1, binary="0.0100110011", fraction=0.2 (达到10位,停止) 所以结果为0.0100110011 注意:实际编程中,浮点数有精度问题,所以可能需要在循环中设置一个很小的阈值来判断小数部分是否为0(比如小于1e-10)。 最后,我们回答用户的问题:十进制小数部分换为二进制小数方法是乘2取整法,具体步骤如上所述。</think>### 十进制小数部分换为二进制方法 十进制小数部分换为二进制采用 **乘2取整法**,具体步骤如下(参考引用[2]和引用[3]): 1. **将小数部分乘以2** 得到乘积(包含整数和小数部分) 2. **提取整数部分** 记录乘积的整数位(0或1),作为二进制的一位 3. **保留小数部分** 取乘积的小数部分作为新的操作数 4. **重复操作** 重复步骤1-3,直到小数部分为0或达到所需精度 5. **组合结果** 将记录的整数位按顺序排列(最先得到的为最高位) #### 示例:将0.625换为二进制 | 步骤 | 计算过程 | 乘积 | 整数位 | 新小数 | 二进制位序列 | |------|------------------|---------|--------|--------|--------------| | 1 | 0.625 × 2 = 1.25 | 1.25 | 1 | 0.25 | 0.1 | | 2 | 0.25 × 2 = 0.5 | 0.5 | 0 | 0.5 | 0.10 | | 3 | 0.5 × 2 = 1.0 | 1.0 | 1 | 0.0 | 0.101 | 最终结果:$0.625_{10} = 0.101_2$ #### 特殊处理情况 1. **无限循环的情况**(如0.1): ``` 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 0.6 × 2 = 1.2 → 取整1 → 新小数0.2(开始循环) ``` 结果:$0.1_{10} = 0.000110011001..._2$(循环节"0011") 2. **带整数部分的数**(如3.25): - 整数部分3 → $11_2$(除2取余法) - 小数部分0.25: ``` 0.25 × 2 = 0.5 → 取整0 0.5 × 2 = 1.0 → 取整1 ``` 小数部分 → $0.01_2$ - 组合结果:$3.25_{10} = 11.01_2$[^3] #### 注意事项 - **精度控制**:无限循环小数需根据需求确定保留位数 - **浮点数精度**:计算机中浮点数存储有精度限制(如IEEE 754标准) - **负数处理**:先换绝对值,再补充符号位[^3] > 关键点:每次乘法后,**整数位决定二进制位**,**小数部分决定下一步操作**。这种方法基于小数部分的权重关系: > $0.d_1d_2d_3..._2 = d_1×2^{-1} + d_2×2^{-2} + d_3×2^{-3} + ...$[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值