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位,超出比较的精度就会得到错误的结果。

原文地址:https://www.cnblogs.com/loren-Yang/p/7535669.html