Float与二进制之间的转化(Java实现)
在线转化:http://www.binaryconvert.com
2
3 import java.text.DecimalFormat;
4
5
6 public class SinglePrecision {
7
8 //浮点到二进制
9 public String Float2Binary(double n) {//使用double输入,不影响
10 int signBit;//符号位
11 // String s = Float.toString((float) n); 这个方法会自动用 科学记数法4.52E-4
12 String s = (new DecimalFormat("################.######")).format(n);
13
14 /**
15 * 处理符号位
16 * 本来是有正负0的,这个地方就默认是正0了
17 */
18 if (n == 0) {
19 signBit = 0;
20 } else if (n < 0) {
21 signBit = 1;
22 s = s.substring(1);//把负号去掉
23 } else {
24 signBit = 0;
25 }
26
27 /**
28 * 不用判断是小数还是整数,Float.toString()会自动在整数后补0,0也一样
29 * 将整数部分小数部分分开:
30 */
31 String intFloat[] = s.split("\\.");
32 int intPart = Integer.valueOf(intFloat[0]);
33 float floatPart = Float.valueOf("0." + intFloat[1]);
34 // System.out.println(s);
35 // System.out.println(intPart);
36 //处理整数部分
37 boolean isReady = false;
38 String str_intpart = ""; //以1开头的二进制数 如10——>1010,而不是32位
39 for (int i = 31; i >= 0; i--) { //
40 if (((intPart >> i) & 1) == 1) {
41 isReady = true;
42 }
43 if (isReady) {
44 str_intpart += ((intPart >> i) & 1) == 1 ? 1 : 0;
45 }
46 }
47
48 //处理小数部分——乘2取整法
49 String str_floartPart = "";
50 while (floatPart != 0) {
51 floatPart *= 2;
52 if (floatPart >= 1) {
53 floatPart -= 1;
54 str_floartPart += 1;
55 } else str_floartPart += 0;
56 }
57
58 /**
59 * 规格化
60 */
61 String str_int_float = str_intpart + str_floartPart+"0000000000000000000000000000000"; //补0是因为可能不够长
62 //现在得到二进制下的:"整数(.)小数"格式。考虑规格化
63 int diff = 0;// 规格化所要将小数部分移动的位数,主要是针对整数部分为0的
64 int intlen = str_intpart.length();
65 str_intpart = str_int_float.substring(0, 1);
66 str_floartPart = str_int_float.substring(1,23);
67 while (str_intpart.charAt(0) != '1') {
68 str_intpart = str_floartPart.substring(0, 1);
69 str_floartPart = str_floartPart.substring(1);
70 diff++;
71 }
72
73 int expChange = intlen != 0 ? intlen - 1 : -diff - 1; //规格化所带来的指数的移动
74
75 //得到8位指数部分;
76 int exponential = expChange + 127;//真正的指数
77 String exp = ""; //指数
78 for (int i = 7; i >= 0; i--) {
79 exp += ((exponential >> i) & 1) == 1 ? 1 : 0;
80 }
81
82 //得到23位底数部分
83 String base = str_floartPart;
84 int len = base.length();
85 for (int i = 0; i < 23 - len; i++) {
86 base += 0;
87 }
88
89 return signBit + " " + exp + " " + base;
90 }
91
//二进制到浮点小数
92 public double binary2Float (String binary){
93 if (binary.length()!=32) {
94 System.out.println("Error!");
95 return 0;
96 }
97 String exp = binary.substring(1,9);
98 String base = "1"+binary.substring(9);
99 /**
100 * 分类:
101 * 底数全是0
102 */
103 double Base = 0;
104 int Exp = Integer.valueOf(exp,2)-127;
105 for (int i =0;i<24;i++){
106 Base+=(base.charAt(i)=='1'?Math.pow(2,-i):0);
107 }
108 return Base*Math.pow(2,Exp);
109 }
110
111 public static void main(String[] args) {
112 SinglePrecision sp = new SinglePrecision();
113 System.out.println(sp.Float2Binary(256.9375));
114 System.out.println(sp.binary2Float("01000011100000000111100000000000"));
115
116 /**
117 * output:
118 * 0 10000111 00000000111100000000000
119 * 256.9375
120 */
121
122 }
123 }
//目前精度还是不够,误差较大。