zoukankan      html  css  js  c++  java
  • 浮点数的数据结构

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

    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 按值填入数据结构中

  • 相关阅读:
    Angular入门到精通系列教程(3)
    Angular入门到精通系列教程(1)
    Angular入门到精通系列教程(2)
    嵌入在iframe中的Angular站点,如何打开一个新的tab页面
    简单实现无服务器情况下,2个GIT客户端的同步
    QP01 创建检验批计划
    IW31创建维修工单
    屏幕里输入字段值后的检查 SCREEN FIELD CHECK ON INPUT
    elasticsearch 基于文章点赞数计算评分
    script_score(帖子--根据 销量和浏览人数进行相关度提升)
  • 原文地址:https://www.cnblogs.com/sunfan1988/p/3932714.html
Copyright © 2011-2022 走看看