关于浮点数精度的一些问题
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定义 用于比较是相等的 -
同一个数分别用
float和double定义 用于比较是不同的!
浮点数计算
上代码!
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);
给个例子感受下。。。

浙公网安备 33010602011771号