浮点数的数据结构

周末在家,重新学习了一下以前不太懂的知识点。浮点数和数据结构。

1 什么是浮点数?

通俗来说带有小数点的数都是浮点数。比如1.1,121.212,-1.11,-222.111

2 在JAVA中常用表示浮点数的类型是什么?区别是什么?

在JAVA中,通常使用的浮点数的类型为 FLoat和Double,他们的区别在于大小与储存方式不同

public class App {
    public static void main(String[] args) {
        System.out.println("Float:"+Float.SIZE);
        System.out.println("Double:"+Double.SIZE);
    }
}
Float:32
Double:64

从这里可以看出FLoat是32位的,Double是64位

Float的储存结构          0        00000000 00000000000000000000000

                            符号位1     阶数位8      小数位23(8388607(7位十进制)<9999999(7位十进制))所以他的精度是保证6但不到7

Double的储存结构      0        00000000000    0000000000000.。。。。。。。。。。。。。。。。

                            符号位1     阶数位11     小数位52---------这个就很多了

3 浮点数二进制源码如何转换成对应的FLOAT和DOUBLE的数据结构呢?

这里有几个步骤 

step1 得到 二进制浮点数源码 比如1010101.101011011

step2 二进制源码转换为二进制科学计数法1.010101101011011E0110(0110表示<<6)

step3 E0110转换成阶码,如果是FLOAT的阶位转换是0110+1111111(7位)Double的阶位转换是0110+1111111111(10位) 

step4 按照浮点数的储存结构来存放咯。

4 做一道例题(摘自网上)

    public static void main(String[] args) {
        float f_v1 = 20;
        float f_v2 = 20.3f;
        float f_v3 = 20.5f;
        double d_v1 = 20d;    
        double d_v2 = 20.3d;
        double d_v3 = 20.5d;
        System.out.println(f_v1==d_v1);
        System.out.println(f_v2==d_v2);
        System.out.println(f_v3==d_v3);
    }
true
false
true

第一题和第三题的TRUE的原因是,二进制浮点数的位数比较少,小于Float的23位,所以Float完全能精确到

第二题中的FLASE的原因是,0.3的二进制浮点数是一个无线循环小数,超过了Float的23位,Float进行了截短到23位,而Double有52位,所以2者不相同。

知道了原理后,我们怎么让他变成TRUE呢?

    public static void main(String[] args) {
        float f_v2 = 20.3f;
        double d_v2 = (float)20.3d;
        System.out.println(f_v2==d_v2);
    }
true

很简单,我们去按照Float类型截短一下就OK了。

5 帮助小贴士-如何转换10进制浮点数-->2进制源码

10进制20.3

step1 整数部分 20-->10100

计算过程:

除法    是否有余数 

20/2    0

10/2    0

5/2      1

2/2      0

1/2      1

step2 小数部分 0.3-->010011001100。。。

计算过程

0.3*2 = 0.6     0

0.6*2 =  1.2    1

0.2*2 = 0.4     0

0.4*2 = 0.8     0

--------------

0.8*2 = 1.6     1

0.6*2 = 1.2     1

0.2 *2 = 0.4    0

0.4*2 = 0.8     0

--------------

...                  1

...                  1

...                  0

...                  0

step3 整合整数和小数部分 10100.010011001100

如果需要转换成Float或者Double的话,参照上面文中的流程

1 转科学计数法

2 指数部分转换为阶数位(Float是127,Double是1023)

3 按值填入数据结构中

原文地址:https://www.cnblogs.com/sunfan1988/p/3932714.html