周末在家,从新学习了一下之前不太懂的知识点。浮点数和数据结构。数据结构
1 什么是浮点数?学习
通俗来讲带有小数点的数都是浮点数。好比1.1,121.212,-1.11,-222.111spa
2 在JAVA中经常使用表示浮点数的类型是什么?区别是什么?3d
在JAVA中,一般使用的浮点数的类型为 FLoat和Double,他们的区别在于大小与储存方式不一样code
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位blog
Float的储存结构 0 00000000 00000000000000000000000源码
符号位1 阶数位8 小数位23(8388607(7位十进制)<9999999(7位十进制))因此他的精度是保证6但不到7class
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 按值填入数据结构中