二进制的小数转十进制
例如:0.101 -->1*1/(2^1)+0*1/(2^2)+1*1/(2^3)=1*0.5+0*0.25+1*0.125=0.625
即二进制转十进制是每一位乘以 ... 2^n,2^(n-1),...,2^1,2^0,2^(-1),2^(-2),...
十进制转二进制
由于二进制转十进制时:整数部分是乘以2,小数部分是除以2,那么反过来我们同样分两部分处理,并进行和之前相反的操作。
及整数部分不断除以2,而小数部分不断乘以2。
显然第一次乘以2如果能得到一个1,那么在以2^(-1)为基数的位置上是1.我们用一个式子来解释
a=a0*0.5+a1*0.25+a2*0.125+... (a是十进制表示,右边是二进制表达式,由于是二进制,显然a0,a1,a2,...等只能取0或1)
我们将这个式子乘以2,变成2*a= a0+(a1*0.5+a2*0.25+...),分析一下这个式子,此时a0等于2*a小数点左边的数,要么为0,要么为1.
现在,我们两边同时减去a0,即将整数部分去掉,接着再次乘以2,可以继续分离出a1,接下来就是同样的步骤了。
可能我描述的还不够清晰,我们举个例子,5.71这个数,我们很容易知道整数部分的二进制是101,接下来我们计算0.71的二进制。
0.71*2=1.42 即 a0=1
0.42*2=0.84 即 a1=0
0.84*2=1.68 即 a2=1
0.68*2=1.36 即 a3=1
...
继续算下去我们可以得到一个0.1011...的二进制数,但是显然我们无法计算出完整的二进制值,因为0.71不论乘以多少次2都还会有小数部分,只有部分小数才可以在有限次的计算后得到精确的二进制数。
例如0.75
0.75*2=1.5 a0=1
0.5*2=1.0 a1=1
0.75(十进制)=0.11(二进制)
这就解释了浮点数的精度丢失问题,小数存储在计算机中后很大可能会出现数值上的偏差,有时会带来一些意想不到的影响。
浮点数在计算机中存储形式:数符 指数 尾数
以上为本人对小数的一些理解总结,如有不当之处望指正。