zoukankan      html  css  js  c++  java
  • Java中float和double的精度

    比较基本类型double和float和某一个数是否相等的时候,不要用==或>=或<=,因为double和float都是有精度问题的,计算机只能保存一定位数的小数,这就会存在精度问题。

    下面我们看一下java中float和double能够比较到小数后几位:

    代码实现:

    public class Main {
        public static void main(String[] args) {
            float f6 = 1.000003f;//6位小数位,总共7位
            float f_8 = 10.000003f;//6位小数位,总共8位
            double d15 = 1.000000000000003;//15位小数位,总共16位
            double d_17 = 10.000000000000003;//15位小数位,总共17位
            
            float f7 = 1.0000003f;//7位小数位,总共8位
            float f_9 = 10.0000003f;//7位小数位,总共9位
            double d16 = 1.0000000000000003;//16位小数位,总共17位
            double d_18 = 10.0000000000000003;//16位小数位,总共18位   
            
            float f8 = 1.00000003f;//8位小数位,总共9位
            float f_10 = 10.00000003f;//8位小数位,总共10位
            double d17 = 1.00000000000000003;//17位小数位,总共18位
            double d_19 = 10.00000000000000003;//17位小数位,总共19位        
            
            System.out.println(f6==1);
            System.out.println(d15==1);
            System.out.println("------------------");
    
            System.out.println(f7==1);
            System.out.println(d16==1);
            System.out.println("------------------");
    
            System.out.println(f8==1);
            System.out.println(d17==1);
            System.out.println("------------------");
    //-----------------------------------------------
            System.out.println(f_8==10);
            System.out.println(d_17==10);
            System.out.println("------------------");
    
            System.out.println(f_9==10);
            System.out.println(d_18==10);
            System.out.println("------------------");
    
            System.out.println(f_10==10);
            System.out.println(d_19==10);
            System.out.println("------------------");
        }
    }

    输出结果:

    false
    false
    ------------------
    false
    false
    ------------------
    true
    true
    ------------------

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

    false
    false
    ------------------
    true
    true
    ------------------
    true
    true
    ------------------

    再举一个案例:

    public class Main {
        public static void main(String[] args) {
            float f6 = 10000003.87f;//整数位8位,总共10位
            float f_8 = 100000003.87f;//整数位9位,总共11位
            
            System.out.println(f6==10000003);
    
            System.out.println(f_8==100000003);
        }
    }

    输出结果:

    false

    true

    上面两个案例说明,float和double的精确度是按照整体位数来的,并不是只是考虑小数部分。根据显示结果可以看出,float只能精确8位,double可以精确比较到17位,超出比较的精度就会得到错误的结果。

  • 相关阅读:
    SiteMesh入门(1-1)SiteMesh是什么?
    接口和抽象类有什么区别
    StringUtils工具类常用方法汇总(判空、转换、移除、替换、反转)
    StringUtils工具类常用方法汇总(截取、去除空白、包含、查询索引)
    加密方法与HTTPS 原理详解
    String.split()与StringUtils.split()
    自动生成注释
    linux下安装与部署redis
    mybatis批量保存的两种方式(高效插入)
    pagehelper的使用
  • 原文地址:https://www.cnblogs.com/loren-Yang/p/7535669.html
Copyright © 2011-2022 走看看