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 ...
随机推荐
- Visual Studio 2013 更新 NuGet 包管理器
Ø 前言 使用 Visual Studio 中的 NuGet 包管理器下载程序时,有时可能出现类似的错误:. 5. 在"联机"选项中搜索"NuGet",选 ...
- rabbitMQ学习1:消息队列介绍与rabbitmq安装使用
1. 什么是消息队列 生活里的消息队列,如同邮局的邮箱, 如果没邮箱的话, 邮件必须找到邮件那个人,递给他,才玩完成,那这个任务会处理的很麻烦,很慢,效率很低 但是如果有了邮箱, 邮件直接丢给邮箱,用 ...
- ue4 编辑器记录
Matinee 编辑器 菜单:Add New Empty Group->选择要变动的Actor->菜单:Add Actor->菜单:Add Key->变更Actor属性-> ...
- webpack指定第三方模块的查找路径
通常我们会使用一些地方模块在我们的项目中,比如bootstrap import 'bootstrap' 导入的bootstrap默认会查找当前目录的node_modules文件,但是如果这个文件没有, ...
- sap部署
SAP部署 连接sap系统需要通过sap javaconnect来连接,对于sapjco.jar系列文件有32位与64位之分.即对jdk有严格要求.现说明客户端部署及服务端部署两种情况: 一. 部署客 ...
- jq的dom操作
代码可以在该网址测试:www.w3school.com.cn/tiy/t.asp?f=jquery_manipulation_detach_move attr 使用函数来设置属性/值:函数参数为选择器 ...
- yum2
首先yum源的主配置文件为/etc/yum.conf文件.这个文件一般不用动,而我们配置具体的各个yum源的配置文件在/etc/yum.repo.d目录下,所有以repo结尾的文件都是yum源配置文件 ...
- 域scope 介绍,及查找数据
书中介绍<jsp:useBean> 中属性 scope: <%@ page language="java" pageEncoding="UTF-8& ...
- MySql 在cmd下的学习笔记 —— 有关游标的操作(cursor)
---恢复内容开始--- cursor 指在1条sql,对应N条资源,取出资源的接口/句柄,就是游标 沿着游标,可以一次取出一行 对于游标,必须要先声明一下 fetch 会读取每一条记录,当没有时,会 ...
- [转]Python中的eval()、exec()及其相关函数
Python中的eval().exec()及其相关函数 刚好前些天有人提到eval()与exec()这两个函数,所以就翻了下Python的文档.这里就来简单说一下这两个函数以及与它们相关的几个函数 ...