十进制小数 与 二进制小数 互转

1、十进制小数 转 二进制小数

公式 (光文字可能看起来很复杂…可以看图和例子)
  1. 小数 * 2得到n1, 将n1的整数作为二进制数第一位;
  2. n1的小数 * 2得到n2, 将n2的整数作为二进制数第二位;
  3. n2的小数 * 2得到n3, 将n3的整数作为二进制数第三位;
  4. … 重复以上步骤,直到小数部分为0或者达到指定的精度即可。

请添加图片描述

例子一: 十进制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 * 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.1转2进制不管怎么乘2结果小数位不可能为0,是一个无限循环小数,只能截取一部分。
我们再将获得的整数部分组合起来
二进制为:0.00011001100110011001101(截取23位)

例子二: 十进制0.2转二进制

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.00110011001100110011011(截取23位)

例子三: 十进制0.3转二进制

0.3 * 2 = 0.6 →取整数部分0
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.3转2进制同样是一个无限循环小数,只能截取一部分。
二进制为:0.01001100110011001100110(截取23位)

例子三: 十进制0.5转二进制

0.5 * 2 = 1.0 →取整数部分1

二进制为:0.1

我们可以看出,0.1和0.2转二进制的时候就已经失去精度了。

截取无限循环数时,向上取舍。

截取n位时,判断(n+1)位是否为1,为1则n位+1,为0直接舍去。

0.1100截取为3位,第4位为0,直接舍去。
0.1001截取为3位,第4位为1,第3位+1 ----> 0.101


2、二进制小数 转 十进制小数

小数点后开始,依次乘以2的负一次方,2的负二次方,2的负三次方…

公式:
  1. 小数第 1 位 ∗ 2 − 1 小数第1位 * 2^{-1} 小数第121
  2. 小数第 2 位 ∗ 2 − 2 小数第2位 * 2^{-2} 小数第222
  3. 小数第 3 位 ∗ 2 − 3 小数第3位 * 2^{-3} 小数第323
  4. 小数第 4 位 ∗ 2 − 4 小数第4位 * 2^{-4} 小数第424
  5. 最后将所有计算结果求和,就能得到十进制小数了。
例子一: 二进制0.1转十进制

0.1 ∗ 2 − 1 0.1*2^{-1} 0.121 = 0.5

例子二: 二进制0.01001100110011001100110转十进制

0 ∗ 2 1 + 1 ∗ 2 − 2 + 0 ∗ 2 − 3 + 0 ∗ 2 − 4 + 1 ∗ 2 − 5 + 1 ∗ 2 − 6 + 0 ∗ 2 − 7 + 0 ∗ 2 − 8 + 1 ∗ 2 − 9 + 1 ∗ 2 − 10 + 0 ∗ 2 − 11 + 0 ∗ 2 − 12 + 1 ∗ 2 − 13 + 1 ∗ 2 − 14 + 0 ∗ 2 − 15 + 0 ∗ 2 − 16 + 1 ∗ 2 − 17 + 1 ∗ 2 − 18 + 0 ∗ 2 − 19 + 0 ∗ 2 − 20 + 1 ∗ 2 − 21 + 1 ∗ 2 − 22 + 0 ∗ 2 − 23 0*2^{1} + 1*2^{-2}+ 0*2^{-3}+ 0*2^{-4}+ 1*2^{-5}+ 1*2^{-6}+ 0*2^{-7}+ 0*2^{-8}+ 1*2^{-9}+ 1*2^{-10}+ 0*2^{-11}+ 0*2^{-12}+ 1*2^{-13}+ 1*2^{-14}+ 0*2^{-15}+ 0*2^{-16}+ 1*2^{-17}+ 1*2^{-18}+ 0*2^{-19}+ 0*2^{-20}+ 1*2^{-21}+ 1*2^{-22}+ 0*2^{-23} 021+122+023+024+125+126+027+028+129+1210+0211+0212+1213+1214+0215+0216+1217+1218+0219+0220+1221+1222+0223
= 0 + 0.25 + 0 + 0 + 0.03125 + 0.015625 + 0 + 0 + 0.001953125 + 0.0009765625 + 0 + 0 + 0.0001220703125 + 0.00006103515625 + 0 + 0 + 0.00000762939453125 + 0.000003814697265625 + 0 + 0 + 0.000000476837158203 + 0.000000238418579101 + 0 0+ 0.25+ 0+ 0+ 0.03125+ 0.015625+ 0+0+ 0.001953125+ 0.0009765625+ 0+ 0+ 0.0001220703125+ 0.00006103515625+0+ 0+ 0.00000762939453125+ 0.000003814697265625+ 0+ 0+ 0.000000476837158203+ 0.000000238418579101+ 0 0+0.25+0+0+0.03125+0.015625+0+0+0.001953125+0.0009765625+0+0+0.0001220703125+0.00006103515625+0+0+0.00000762939453125+0.000003814697265625+0+0+0.000000476837158203+0.000000238418579101+0
= 0.299999952316284179


  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码鹿的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值