十进制小数与二进制互转(每个程序员都应该了解的浮点运算法则)

十进制转二进制

比如 10.13

1. 整数部分(除2取余,逆序排列)

具体做法是,用2去除十进制数的整数部分,可以得到一个商和一个余数;再用2去除商,又会得到一个商和余数;继续用2去除商,一直到商为0时停止;然后逆序将余数排列起来,得到二进制数。

10.13的整数部分是10

10 / 2 = 5……0
5  / 2 = 2……1
2  / 2 = 1……0
1  / 2 = 0……1

逆序排列之后, 得到 10 的二进制为 1010
2. 小数部分(乘2取整,顺序排列)

具体做法是,用2乘以十进制数的小数部分,可以得到一个积;将积的小数部分取出,再乘以2,又得到一个积;继续将积的小数部分取出,乘以2,直到积的小数部分为0,或者达到所要求的的精度(浮点数位数有限,不能精确的表示出所有实数,所以当位数超出格式允许的位数时,会将剩余的数字舍入,即舍入误差。);经上面所有积的整数部分,顺序排列起来,得到二进制数。

10.13的小数部分是 0.13

0.13  * 2 = 0.26  整数部分为0,小数分布0.26
0.26  * 2 = 0.52  整数部分为0,小数分布0.52
0.52  * 2 = 1.04  整数部分为1,小数分布0.04
0.04  * 2 = 0.08  整数部分为0,小数分布0.08
0.08  * 2 = 0.16  整数部分为0,小数分布0.16
0.16  * 2 = 0.32  整数部分为0,小数分布0.32
0.32  * 2 = 0.64  整数部分为0,小数分布0.64
0.64  * 2 = 1.28  整数部分为1,小数分布0.28
0.28  * 2 = 0.56  整数部分为0,小数分布0.56
.
.
.

顺序排列之后, 得到 0.13 的二进制为 0.001000010……


如果是 0.25
0.25  * 2 = 0.50  整数部分为0,小数分布0.50
0.50  * 2 = 1.00  整数部分为1,小数分布0.00
顺序排列之后, 得到 0.25 的二进制为 0.01

所以10.13的二进制为 1010.001000010…… ; 10.25的二进制为 1010.01

二进制转十进制(按权相加法)

具体做法是,先将二进制数写成加权系数展开式,然后按照十进制加法规则求和。

比如 1010.01

  1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 + 0*2^-1 + 1*2^-2
= 8 + 0 + 2 + 0+ 0 + 1/4
= 10.25

再比如 1010.001000010

  1*2^3 + 1*2^1  + 1*2^-3 + 1*2^-8
= 8 + 2 + 1/8 + 1/256
= 10 + 33/256
= 10.12890625

参考: The Floating-Point Guide - What Every Programmer Should Know About Floating-Point Arithmetic

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值