关于浮点数精度的一些问题

1.浮点数在底层的存储问题

上代码!

	int i = 2147483647;
        float f = 2147483647F;
        double d = 2147483647;
        System.out.println(i);//2147483647
        System.out.println(f);//2.14748365E9
        System.out.println(d);//2.147483647E9
        System.out.println(f == d);//false
        System.out.println(i == f & f == d);//false
        System.out.println(i == d);//true
        System.out.println(i == f);//true

由以上结果得出以下结论:

  • 浮点数在底层存储的方式是采用科学计数法计数。

  • 同一个数使用不同数据类型定义,在底层存储的值也不大一样。

  • 同一个数用 int 定义和 float/double 定义 用于比较是相等的

  • 同一个数分别用floatdouble定义 用于比较是不同的!

浮点数计算

上代码!

	double a = 1;
        double b = 0.7;
        System.out.println(a - b);//0.30000000000000004

由以上结果得出:

  • 浮点数在底层计算是不精确的,是一个近似值

继续上代码!

	int a = 1;
        int b = 0;
        System.out.println(a / b);
        //Exception in thread "main" java.lang.ArithmeticException: / by zero  at com.indigo.text.Demo1.main(Demo1.java:23)
  • 除数为0,报除数不能为0的错误。

继续继续上代码!!

	double a = 1;
        int b = 0;
        System.out.println(a / b);
        double a1 = 1;
        double b1 = 0;
        System.out.println(a1 / b1);
        double a2 = 1;
        float b2 = 0F;
        System.out.println(a2 / b2);

        float a3 = 1;
        int b3 = 0;
        System.out.println(a3 / b3);
        float a4 = 1;
        double b4 = 0;
        System.out.println(a4 / b4);
        float a5 = 1;
        float b5 = 0F;
        System.out.println(a5 / b5);

        int c = 1;
        double v = 0;
        System.out.println(c / v);
        int n = 1;
        float m = 0F;
        System.out.println(n / m);

以上代码输出结果均为Infinity!!!

由以上结果可得:

  • 在计算1/0时,只要被除数和除数任意一方为浮点数,就会出现近似值计算,结果为无穷大。

END

	//操作比较大的数的时候,注意溢出问题
        //JDK新特性 , 数字之间可以用下划线分割
        int money = 10_0000_0000;
        int years = 20;
        int sum = money * years;//-1474836480,计算的时候溢出了
        long sum2 = money * years;//默认是int,转换之前存在问题了
        long sum3 = money *((long)years);//先把一个数转换为long  计算的结果就是long
        System.out.println(sum);
        System.out.println(sum2);
        System.out.println(sum3);

给个例子感受下。。。

posted @ 2021-12-11 11:15  Indigo。  阅读(76)  评论(0)    收藏  举报