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 }

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM