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 ...
随机推荐
- ubuntu终端命令启动matlab方法
让所有用户都有权限使用matlab,在终端输入 sudo gedit /etc/profile 在后行写 export MATLABPATH=/home/ubuntu/MATLAB/R2016b:$M ...
- oracle 窗口函数over
select *,sum(字段) over()from table :--相加所有行这个字段的和 select max(字段1),over(partition by 字段2,字段3) from ta ...
- oracle查看表空间数据文件使用情况
-- 查看表空间数据文件使用情况 select a.*, round(a.usedgb/a.maxgb*100) || '%' usedPer from ( select t.TABLESPACE_N ...
- PS与AI快捷键小结
[文档整理系列] PS与AI快捷键小结PS快捷键 填充前景色 alt+del填充背景色 crel+del前景色与背景色互换: x[英文状态] 切换打开的文件:ctrl + tab关闭当前文件: ctr ...
- [C++]基于Curses库的实时系统监测可视化系统-2017-12-09 15-07-42
Congratulations 0.0 技术记录 [1] [C++]Linux之Ubuntu下编译C程序出现错误:“ stray ‘\302'或者'\240' in program”的解决方案 [2 ...
- java 写 Excel(不生成实体文件,写为流的形式)
java 写 Excel(不生成实体文件,写为流的形式) public String exportReportExcel(String mediaCode, List<SimpleMediaRe ...
- Kotlin数据模型
Java中的常用的Bean类,每一个变量我们都需要写getter,setter方法,却都要手动实现很多方法: 尽管可以用工具帮我们完成,但是代码显得很臃肿,不灵活. 特别是当我们需改其中某一个成员的时 ...
- mysql 与linux ~ 内存分析与调优
一 简介:linux内存和mysql二 分类 1 用户空间和内核空间 用户空间内存,从低到高分别是五种不同的内存段 1 只读段 包含代码和常量等 2 数据段 包含全局 ...
- w10谷歌chrome关闭自动更新
运行输入:msconfig打开服务 选择服务,找到谷歌更新 ,点击禁用 ,然后保存 保存会要求重启电脑 ,重启后打开页面谷歌 ,会出现弹窗,是否更新 ,点否 . 然后解决,不会再自动更新了. 这是 ...
- 20165325 2017-2018-2 《Java程序设计》第七周学习总结
一.教材学习笔记 ch11 1.连接数据库 2.条件与排序查询: where子语句 一般格式:select 字段 from 表名 where 条件 排序:用order by子语句对记录排序 3.更新. ...