周末在家,重新学习了一下以前不太懂的知识点。浮点数和数据结构。
1 什么是浮点数?
通俗来说带有小数点的数都是浮点数。比如1.1,121.212,-1.11,-222.111
2 在JAVA中常用表示浮点数的类型是什么?区别是什么?
在JAVA中,通常使用的浮点数的类型为 FLoat和Double,他们的区别在于大小与储存方式不同
public class App { public static void main(String[] args) { System.out.println("Float:"+Float.SIZE); System.out.println("Double:"+Double.SIZE); } }
Float:32 Double:64
从这里可以看出FLoat是32位的,Double是64位
Float的储存结构 0 00000000 00000000000000000000000
符号位1 阶数位8 小数位23(8388607(7位十进制)<9999999(7位十进制))所以他的精度是保证6但不到7
Double的储存结构 0 00000000000 0000000000000.。。。。。。。。。。。。。。。。
符号位1 阶数位11 小数位52---------这个就很多了
3 浮点数二进制源码如何转换成对应的FLOAT和DOUBLE的数据结构呢?
这里有几个步骤
step1 得到 二进制浮点数源码 比如1010101.101011011
step2 二进制源码转换为二进制科学计数法1.010101101011011E0110(0110表示<<6)
step3 E0110转换成阶码,如果是FLOAT的阶位转换是0110+1111111(7位)Double的阶位转换是0110+1111111111(10位)
step4 按照浮点数的储存结构来存放咯。
4 做一道例题(摘自网上)
public static void main(String[] args) { float f_v1 = 20; float f_v2 = 20.3f; float f_v3 = 20.5f; double d_v1 = 20d; double d_v2 = 20.3d; double d_v3 = 20.5d; System.out.println(f_v1==d_v1); System.out.println(f_v2==d_v2); System.out.println(f_v3==d_v3); }
true false true
第一题和第三题的TRUE的原因是,二进制浮点数的位数比较少,小于Float的23位,所以Float完全能精确到
第二题中的FLASE的原因是,0.3的二进制浮点数是一个无线循环小数,超过了Float的23位,Float进行了截短到23位,而Double有52位,所以2者不相同。
知道了原理后,我们怎么让他变成TRUE呢?
public static void main(String[] args) { float f_v2 = 20.3f; double d_v2 = (float)20.3d; System.out.println(f_v2==d_v2); }
true
很简单,我们去按照Float类型截短一下就OK了。
5 帮助小贴士-如何转换10进制浮点数-->2进制源码
10进制20.3
step1 整数部分 20-->10100
计算过程:
除法 是否有余数
20/2 0
10/2 0
5/2 1
2/2 0
1/2 1
step2 小数部分 0.3-->010011001100。。。
计算过程
0.3*2 = 0.6 0
0.6*2 = 1.2 1
0.2*2 = 0.4 0
0.4*2 = 0.8 0
--------------
0.8*2 = 1.6 1
0.6*2 = 1.2 1
0.2 *2 = 0.4 0
0.4*2 = 0.8 0
--------------
... 1
... 1
... 0
... 0
step3 整合整数和小数部分 10100.010011001100
如果需要转换成Float或者Double的话,参照上面文中的流程
1 转科学计数法
2 指数部分转换为阶数位(Float是127,Double是1023)
3 按值填入数据结构中