• 008_浮点数误差问题


    一、浮点数

      a):float类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。

      b):double表示这种类型的数值精度是float类型的两倍,又被称作双精度,绝大部分应用程序都采用double类型。

    二、浮点数的表述范围

      

    类型

    占用存储空间

    表数范围

    float

    4字节

    -3.403E38~3.403E38

    double

    8字节

    -1.798E308~1.798E308

    三、在java中表示浮点数的两种表示形式

      a):十进制形式         如:3.14       314.0      0.314

      b):科学记数法形式  如: 314e-2      3.14e2      314E-3

    四、测试浮点数代码:  

    
    
    public class TestFloadAndDoubleType {
    
        public static void main(String[] args) {
            /*
            [X]因为浮点数默认是double类型、而float f=0.1中0.1默认是double类型的、
            这样的话将一个8个字节的double类型转换为4个字节的float类型会出现编译错误
            为了明确其类型我们在后面加f
            */
            //float a=0.1;//[X]错误的
            float b=0.1f;//[√]加f来明确其类型、正确的
            //浮点数可以用科学计数法来表示
            double c=314e-2;//3.14
            double d=314e-3;//0.314
            System.out.println("double c=314e-2中c的执行结果为: c="+c);
            System.out.println("double d=314e-3中d的执行结果为: d="+d);
            //浮点数的比较(注意:浮点数运算结果比较存在误差问题、所以不能精确比较)
            double e=1.0/10; //0.1
            System.out.println("浮点数运算结果误差示例:0.1f==1.0/10其比较结果为:"+(b==e));
            float d1 = 423432423f;
            float d2 = d1+1;
            /**
             * 二进制表示浮点数误差问题
             */
            System.out.println("d1="+d1);
            System.out.println("d2="+d2);
            System.out.println("423432423f==423432423f+1的比较结果为: "+(d1==d2));//天呐尽然误差到相当?
        }
    }
    
    

    测试结果为:

      

    五、总结

      a):浮点数的默认类型为double类型

      b):浮点类型float, double的数据类型不适合在不允许有舍入误差的金融计算领域

      c):由于浮点数占用存储空间有限,所以能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示,其结果只能是接近,但不等于。

      d):二进制浮点数不能精确的表示0.1,0.01,0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。

      e):如果需要进行不产生舍入误差的精确数字计算大小数使用BigDecimal类、大整数BigInteger

      注意:通过以上我们对浮点类型的了解、我们应该避免编程中使用浮点类型进行的运算结果的比较

    如有任何疑问可联系邮箱: 给我发邮件、或直接联系QQ:1584875179 || 点返回首页

  • 相关阅读:
    verilog学习(9)实战之存储器&奇偶校验
    求职经验之综合岗位三面
    求职经验之综合岗位二面
    求职经验之综合岗位
    verilog学习(8)实战之PPL与串行/解串器
    verilog学习(7)实战之扫描链
    verilog学习(6)实战4之触发器与锁存器
    verilog学习(5)实战3之计数器与bus
    verilog学习(4)实战1之基础练习
    求职经验之器件与芯片岗
  • 原文地址:https://www.cnblogs.com/aeon/p/9785078.html
Copyright © 2020-2023  润新知