float和double的数值怎么保存在二进制中

稍微浅学过二进制的人,都清楚二进制是个什么东西。我们都了解正整数是怎么转化成二进制的,那么计算机中,又是怎么保存folat,double类型的数值的呢?

要像弄清楚这个问题,首先得清楚二进制是怎么表示小数的。(这一点请注意了)

十进制是怎么表示小数的呢?

比如,125.456     其实可以分解成 1*10^2+2*10^1+5*10^0+4*10^-1+5*10^-2+6*10^-3

如果用指数表示的话就是   1.25456E2--------(1+2*10^-1+5*10^-2+4*10^-3+5*10^-4+6*10^-5)*10^2

了解清楚了上面的关系,那么二进制中的小数表示应该也很清楚了

0.1---------------------------等于--------------------1*2^-1(0.5)

0.01-------------------------等于--------------------1*2^-2(0.25)

0.001-----------------------等于--------------------1*2^-3(0.125)

0.0001---------------------等于--------------------1*2^-4 (0.0625)

0.00001-------------------        --------------------1*2^-5 (0.03125)

那么任意一个带小数的二进制表示我们都可以表示成这样,例如

10001.101----------------等于-------------1*2^4+1*2^0+1*2^-1+1*2^-3

用指数表示为1.0001101*2^4----------(1+1*2^-4+1*2^-5+1*2^-7)*2^4

接下来就很清楚了,任意一个十进制的数值都可以表示成或者近似表示成(1+1*2^-n+...1*2^-m)*2^k

例如:8.5=1*2^4+1*2^-1

           5.4约等于4+1+0.25+0.125+0.015625=1*2^2+1*2^0+1*2^-2+1*2^-3+1*2^-6

          (这也解释了为什么二进制是不能精确表示1/10,因为无论加多少阶,1/10都不能被上述样式精确表示出来。有些时候也会出现能够除尽的算式,计算机中却不能除尽例如:double f1=3240.0;
        double f2=8.0;
        double f3=(f1*(f2/100))/(1+(f2/100));//结果应该为240
        System.out.println(f3);输出结果为239.99999999999997

       这点参考自:http://www.xue163.com/588880/39103/391036655.html)

总结:现在我们知道了二进制是怎么表示小数,并且任何十进制的数都可以等于或近似表示成(1+1*2^-m+...1*2^-n)*2^k。

那么剩下的就很简单了。我们只要知道:

        float有4个字节32为,首位表示符号,接下来8位表示阶数K,剩下23表示二进制的小数部分。

        double有8个字节,64位,首位表示符号,11位表示阶数k,剩下表示小数部分。

更详细的表示方法,别人已经写了,详见:

http://blog.csdn.net/gjw198276/article/details/6956244


完!!欢迎吐槽和评论,敬请指出不足之处!!!



你可能感兴趣的:(java)