【JAVA基础系列】IEEE754⼆进位浮点算数标准-JAVA转换
器实现
本⽂仅仅是为了加深对IEEE的理解,将32位浮点数转换为IEEE754格式可以使⽤Float.floatToRawIntBits(f)⽅法,该⽅法返回的是⼀个⼗进制数字,使⽤BinaryString(i)可以转换为⼆进制字符串。
Windows7⾥的计算器⽀持各进制的转换,在菜单“查看”中选择“程序员”即可。
32位浮点数IEEE754格式: 1位符号位 + 8位指数位 + 23位尾数
转换思路:
1、计算整数部分的⼆进制格式;
2、计算⼩数部分的⼆进制格式;
3、位移并计算指数
4、合并
package com.holon.sample;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class IEEE754 {
public static void main(String[] args) {
Float f = 100.2f;
IEEE754 ieee = new IEEE754();
String ieee754 = ieee.floatToIEEE754(f);
支持小数点的进制转换器System.out.println(ieee754);
}
/**
* 获取float的IEEE754存储格式
* @param value
* @return
*/
public String floatToIEEE754(float value) {
//符号位
String sflag = value > 0 ? "0" : "1";
//整数部分
int fz = (int) Math.floor(value);
//整数部分⼆进制
String fzb = BinaryString(fz);
//⼩数部分,格式: 0.02
String valueStr = String.valueOf(value);
String fxStr = "0" + valueStr.substring(valueStr.indexOf("."));  float fx = Float.parseFloat(fxStr);
/
/⼩数部分⼆进制
String fxb = toBin(fx);
//指数位
String e = BinaryString(127 + fzb.length() - 1);
//尾数位
String m = fzb.substring(1) + fxb;
String result = sflag + e + m;
while (result.length() < 32) {
result += "0";
}
if (result.length() > 32) {
result = result.substring(0, 32);
}
return result;
}
private String toBin(float f) {
List<Integer> list = new ArrayList<Integer>();
Set<Float> set = new HashSet<Float>();
int MAX = 24; // 最多8位
int bits = 0;
while (true) {
f = calc(f, set, list);
bits++;
if (f == -1 || bits >= MAX)
break;
}
String result = "";
for (Integer i : list) {
result += i;
}
return result;
}
private float calc(float f, Set<Float> set, List<Integer> list) {  if (f == 0 || ains(f))
return -1;
float t = f * 2;
if (t >= 1) {
list.add(1);
return t - 1;
} else {
list.add(0);
return t;
}
}
}
输出结果
浮点数:100.2
IEEE754格式:01000010110010000110011001100110参考:
4 在线转换

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。