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 }

//目前精度还是不够,误差较大。

 

posted @ 2018-11-04 22:41  Edwin_Xu  阅读(3917)  评论(0编辑  收藏  举报