也许中学老师会告诉5、10、20等等的十进制数字怎么化成二进制数字,但又没有老师告诉你怎么将十进制的0.1变成二进制的小数呢?

我们将一个十进制整数化为二进制是这样操作的:在十进制的计算法则中,将十进制数除以2,得到商和余数;把商除以2,得到商和余数;...重复下去,直到商为0。然后把每次得到的余数按倒序排列,就得到了二进制数字。比如6:

$$\begin{aligned}6\div 2=3...0 \\ 3\div 2=1...1 \\ 1\div 2=0...1\end{aligned}$$

倒过来就是110。这就是二进制中的6了。

为什么要这样操作呢?这要从二进制变成十进制的方法谈起。一个二进制数$abcde$变成十进制数的方法是$e+2d+2^2 c+2^3 b+2^4 a$,这从二进制的计数规则就可以得出:其实就是说a,b,c,d,e分别代表着$10^4 , 10^3 , 10^2 ,10,10^0$位,但是二进制的10就是十进制的2,所以就得出上面的公式。从二进制变十进制的方法就不难得出十进制的法则了,不断除以2,计算余数就分别可以得出a,b,c,d,e了。

整数还是挺好办的,那么小数怎么办呢?比如$0.1=\frac{1}{10}$,而$(10)_{10}=(1010)_2$,所以有
$$(\frac{1}{10})_{10}=(\frac{1}{1010})_2$$

如果你熟悉二进制的计算,你直接可以在二进制的法则内算$\frac{1}{1010}$,就得出0.1的二进制表示啦。不过这是一种比较麻烦的方法,关键是我们大多数人都不熟悉二进制的计算。那怎么办呢?我们可以想一种迂回的方法。虽然在我们不懂二进制的具体计算细则,但是我们不难发现,在二进制里除以10还是很容易的,就跟十进制一样,同样是向左移动小数点而已。所以我们不妨先将十进制的小数不断乘以2,然后取整数部分,化为二进制整数,然后再不断除以二进制的10。

比如0.1
$$\begin{aligned}0.1 \times 2^9=51.2 \\ (51)_{10}=(110011)_2 \\ 110011 \div 10^9 =0.000110011\end{aligned}$$

也就是说十进制0.1表示为二进制大约为0.000110011。不难发现,这种操作是“永无止境”的,即十进制的有限小数0.1在二进制中是无限循环小数!这真是一个有趣的事实!

上述小数转换二进制的方法计算量未免还是有点大了。所以经过简化可以变成一个计算量比较小的“乘2取整”法:

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

比如0.1
$0.1 \times 2=0.2$,取整为0,小数为0.2;
$0.2 \times 2=0.4$,取整为0,小数为0.4;
$0.4 \times 2=0.8$,取整为0,小数为0.8;
$0.8 \times 2=1.6$,取整为1,小数为0.6;
$0.6 \times 2=1.2$,取整为1,小数为0.2;
...
开始陷入循环了。

不难得到二进制表示为0.000110011...,循环节为0011。其实,大多数十进制有限小数变成二进制的时候都是无限循环的,除了那些$\frac{1}{2^n}$类型的小数。当然,不管怎么变,在十进制的无理数也不会变成二进制的有理数,反之亦然。

转载到请包括本文地址:https://kexue.fm/archives/1907

更详细的转载事宜请参考:《科学空间FAQ》

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

如果您需要引用本文,请参考:

苏剑林. (Feb. 05, 2013). 《小数的二进制表示 》[Blog post]. Retrieved from https://kexue.fm/archives/1907

@online{kexuefm-1907,
        title={小数的二进制表示},
        author={苏剑林},
        year={2013},
        month={Feb},
        url={\url{https://kexue.fm/archives/1907}},
}