二进制为什么无法精确表示分数1/10,二进制与十进制如何相互转化


java核心技术卷一中提到:二进制系统中无法精确地表示分数1/10。本文就探究一下该问题,要探究这个问题首先要明白二进制与十进制的转化关系,为方便陈述,下面的所有示例都是正数,没有符号位。

壹、二进制转十进制

一、二进制某位数代表的十进制数字

二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。二进制某位数代表的十进制数字 = 二进制某位数乘以2的(位数-1)次幂。整数部分示例:1 + 1 = 0b10 = 1 * 2(2-1) = 2;小数部分示例:0b0.1 + 0b0.1 = 1 ,0b0.1= 0.5 = 1 * 2(0-1)

二、二进制数转为十进制

二进制数转为十进制公式:二进制每一位数转为十进制相加的和。举例说明:二进制数 0b10101.01;

0b10101.01
= 1 * 2(5-1) + 0 * 2(4-1) + 1 * 2(3-1) + 0 * 2(2-1) + 1 * 2(1-1) + 0 * 2(0-1) + 1 * 2(-1-1)
= 16 + 0 + 4 + 0 + 1 + 0 + 0.25
= 21.25

贰、十进制转二进制

一、整数部分:除2取余,倒序排列

假定一个正整数 x 可以用二进制表示为abcd;
x
= a * 23 + b * 2 2+ c * 21 + d * 20
= 8a + 4b + 2c + d
其中8a、4b、2c肯定是2的倍数,d是0或1,所以x 除以2最后余数就是d;
x - d = 8a + 4b + 2c,双边同时除以2:
(x - d)/2 = 4a +2b + c
同理 4a +2b肯定是2的倍数,c是0或1,所以(x - d)/2 除以2最后余数就是c;相同方法依次求出b,a;
从上面的演算过程不难发现:每次除以2都会有一个余数,该余数就是某位二进制数,越早出现的余数在二进制中的位数越小。所以得出:十进制整数除以2取余数,余数倒序排列,除2取余,倒序排序。

二、小数部分 :乘2取整,正序排列

假定一个正小数 x 可以用二进制表示为0.abcd;
x = a * 2-1 + b * 2-2 + c * 2-3 + d * 2-4
两边同时乘以2得出
2x = a + b * 2-1 + c * 2-2 + d * 2-3;其中a是0或1,0<2x<2,2x的整数部分是a,小数部分等于 b * 2-1 + c * 2-2 + d * 2-3
2x - a = b * 2-1 + c * 2-2 + d * 2-3
两边同时乘以2得出
2(2x - a)= b + c * 2-1 + d * 2-2;其中b是0或1,0<2(2x - a)<2,2(2x - a)的整数部分是b,小数部分等于 c * 2-1 + d * 2-2;相同方法依次求出c,d;
从上面的演算过程不难发现:每次乘以2都会有一个整数,该整数就是小数的某位二进制数,越早出现的整数在二进制中的位数越大。所以得出:十进制小数乘以2取整数,整数正序排列,乘2取整,正序排列。

三、十进制的1/10用二进制如何表示

根据上面的公式十进制小数转二进制:
0.1 * 2 = 0.2 整数部分是0,小数部分0.2,第一位小数是0
0.2 * 2 = 0.4 整数部分是0,小数部分0.4,第二位小数是0
0.4 * 2 = 0.8 整数部分是0,小数部分0.8,第三位小数是0
0.8 * 2 = 1.6 整数部分是1,小数部分0.6,第四位小数是1
0.6 * 2 = 1.2 整数部分是1,小数部分0.2,第五位小数是1
后面就与第一行至第五无限循环,所以二进制无法精确的表示十分之一。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值