Float与二进制之间的转化(Java实现)
在线转化:http://www.binaryconvert.com
import java.text.DecimalFormat; public class SinglePrecision { //浮点到二进制
public String Float2Binary(double n) {//使用double输入,不影响
int signBit;//符号位
// String s = Float.toString((float) n); 这个方法会自动用 科学记数法4.52E-4
String s = (new DecimalFormat("################.######")).format(n); /**
* 处理符号位
* 本来是有正负0的,这个地方就默认是正0了
*/
if (n == 0) {
signBit = 0;
} else if (n < 0) {
signBit = 1;
s = s.substring(1);//把负号去掉
} else {
signBit = 0;
} /**
* 不用判断是小数还是整数,Float.toString()会自动在整数后补0,0也一样
* 将整数部分小数部分分开:
*/
String intFloat[] = s.split("\\.");
int intPart = Integer.valueOf(intFloat[0]);
float floatPart = Float.valueOf("0." + intFloat[1]);
// System.out.println(s);
// System.out.println(intPart);
//处理整数部分
boolean isReady = false;
String str_intpart = ""; //以1开头的二进制数 如10——>1010,而不是32位
for (int i = 31; i >= 0; i--) { //
if (((intPart >> i) & 1) == 1) {
isReady = true;
}
if (isReady) {
str_intpart += ((intPart >> i) & 1) == 1 ? 1 : 0;
}
} //处理小数部分——乘2取整法
String str_floartPart = "";
while (floatPart != 0) {
floatPart *= 2;
if (floatPart >= 1) {
floatPart -= 1;
str_floartPart += 1;
} else str_floartPart += 0;
} /**
* 规格化
*/
String str_int_float = str_intpart + str_floartPart+"0000000000000000000000000000000"; //补0是因为可能不够长
//现在得到二进制下的:"整数(.)小数"格式。考虑规格化
int diff = 0;// 规格化所要将小数部分移动的位数,主要是针对整数部分为0的
int intlen = str_intpart.length();
str_intpart = str_int_float.substring(0, 1);
str_floartPart = str_int_float.substring(1,23);
while (str_intpart.charAt(0) != '1') {
str_intpart = str_floartPart.substring(0, 1);
str_floartPart = str_floartPart.substring(1);
diff++;
} int expChange = intlen != 0 ? intlen - 1 : -diff - 1; //规格化所带来的指数的移动 //得到8位指数部分;
int exponential = expChange + 127;//真正的指数
String exp = ""; //指数
for (int i = 7; i >= 0; i--) {
exp += ((exponential >> i) & 1) == 1 ? 1 : 0;
} //得到23位底数部分
String base = str_floartPart;
int len = base.length();
for (int i = 0; i < 23 - len; i++) {
base += 0;
} return signBit + " " + exp + " " + base;
}
//二进制到浮点小数
public double binary2Float (String binary){
if (binary.length()!=32) {
System.out.println("Error!");
return 0;
}
String exp = binary.substring(1,9);
String base = "1"+binary.substring(9);
/**
* 分类:
* 底数全是0
*/
double Base = 0;
int Exp = Integer.valueOf(exp,2)-127;
for (int i =0;i<24;i++){
Base+=(base.charAt(i)=='1'?Math.pow(2,-i):0);
}
return Base*Math.pow(2,Exp);
} public static void main(String[] args) {
SinglePrecision sp = new SinglePrecision();
System.out.println(sp.Float2Binary(256.9375));
System.out.println(sp.binary2Float("01000011100000000111100000000000")); /**
* output:
* 0 10000111 00000000111100000000000
* 256.9375
*/ }
} //目前精度还是不够,误差较大。
Float与二进制之间的转化(Java实现)的更多相关文章
- 十进制二进制之间的转化 PHP算法
[ 十进制转二进制 ] function test($var){ $func = function($i){ if($i < 2){ return $i; } $return['int'] = ...
- java对象与Json字符串之间的转化(fastjson)
1. 首先引入jar包 在pom.xml文件里加入下面依赖: <dependency> <groupId>com.alibaba</groupId> <art ...
- JAVA 文件与base64之间的转化, 以及Web实现base64上传文件
<1>文件与base64字符串之间的转化 package servlet_file_upload; import java.io.File; import java.io.FileInpu ...
- Java中InputStream和String之间的转化
https://blog.csdn.net/lmy86263/article/details/60479350 在Java中InputStream和String之间的转化十分普遍,本文主要是总结一下转 ...
- java类继承总结一 父类类型与子类类型之间的转化问题(转)
java类继承总结一 父类类型与子类类型之间的转化问题 本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂 ...
- java对象与Json字符串之间的转化
public class Test { public static void main(String[] args) { // 实现java对象与Json字符串之间的转化 // 1. Person对象 ...
- json与javabean之间的转化
接着上一个http://www.cnblogs.com/ya-qiang/p/9009134.html随笔,继续介绍json与java对象之间的转化 一.java普通对象和json字符串的互转 jav ...
- python学习,day2:python字符串和二进制之间的互换
在python3中,byte二进制和striing字符串之间不能直接操作,需要进行编码和解码才行.下面是个例子 msg = '我爱北京天安门' print(msg) print(msg.encode( ...
- c++数字和字符之间的转化
关于C++中数与字符之间的转化 在c++中我们经常遇到需要把一个数变成字符,或者把字符变为一个数,c++中没有直接的转化函数,故我们需要自己去写函数去转化,这里我将介绍两种比较简单的方法: 法一: s ...
随机推荐
- None.js 第五步 Buffer(缓冲区)
// 存数据,取数据; buf = Buffer.alloc(26); for (var i = 0; i < 26; i++) { buf[i] = i + 97; } console.log ...
- luogu 2371 墨墨的等式
1.背包dp #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #define ll ...
- My97DatePicker 只显示月份
<script src="../javascript/My97DatePicker/WdatePicker.js" type="text/javascript&qu ...
- jq的css方法
读属性: $(selector).css(name) 设置属性: 法一: $(selector).css(name,value) 法二: $(selector).css(name,function(i ...
- js开发模式
js中的开发模式进化史: js中有最初的只能由基本数据类型描述——>单例模式-->工厂模式-->构造函数模式-->原型模式-->各个模式相结合的混合模式,下面我会给大家逐 ...
- .innerhtml 与.innertext
示例代码: <div id="test"> <span style="color:red">test1</span> tes ...
- Eclipse安装lombok及常用注解
转自:https://blog.csdn.net/ZJDWHD/article/details/77795023 lombok的官方网址:http://projectlombok.org/ https ...
- 基于【字节】操作的IO接口:InputStream、OutputStream
InputStream 参考链接:对java中FileInputStream.BufferInputStream的理解 /** * Author:Mr.X * Date:2017/10/9 17:11 ...
- Codeforces Round #545 (Div. 2)(D. Camp Schedule)
题目链接:http://codeforces.com/contest/1138/problem/D 题目大意:给你两个字符串s1和s2(只包含0和1),对于s1中,你可以调换任意两个字符的位置.问你最 ...
- 阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义
分层领域模型规约: DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象. DTO( Data Transfer Object):数据传输对象,Service或Ma ...