java 浮点数转换 百分求解,今晚结贴!

revoinfo 2011-12-17 07:01:23

如上图所示, 42 60 b9 41 如何颠倒后,再转换成十进制的 23.172001 又该如何转换成 二进制呐?
请j2se高手亮招!
...全文
215 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yktd26 2011-12-18
  • 打赏
  • 举报
回复
	public static void main(String[] args) {
String input = "4260b941";

int n = Integer.reverseBytes(Integer.parseInt(input, 16));
float f = Float.intBitsToFloat(n);

System.out.println(f);
System.out.println(Integer.toBinaryString(n));

}
revoinfo 2011-12-18
  • 打赏
  • 举报
回复
非常抱歉,昨晚有事,没来得及上.
Jaya1989 2011-12-17
  • 打赏
  • 举报
回复
(6)左移4位,4的二进制0011,不足7位则:0000,011
这句写错了,是(6)左移4位,(4-1)的二进制0011,不足7位则:0000,011
Jaya1989 2011-12-17
  • 打赏
  • 举报
回复
楼上的回答很不错。

其实只要理解了float的存储方式,计算起来就不难。

float内存存储结构(共4字节,32位分别如下):
31 30 29----23 22----0

实数符号位 指数符号位 指数位 有效数位
其中实数符号位0表示正,1表示负;指数符号位1表示正,0表示负

float在计算机中的存储计算方法:
1. 先将这个实数的绝对值化为二进制格式,方法是:实数的整数部分是除2取余和小数部分是乘2取整
2. 将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。
3. 从小数点右边第一位开始数出二十三位数字放入第22到第0位。
4. 如果实数是正的,则在第31位放入“0”,否则放入“1”。
5. 如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。
6. 如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,

则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。

根据上面那个步骤得:
(1). 23.172001二进制形式为:0001,0111.0010,1100,0000,1000,0100,0001....
(2)左移4位得:1.0111.0010,1100,0000,1000,0100,0001
(3)取小数点后23位得: 0111.0010,1100,0000,1000,010(这23位为float数二进制码的后23位)
(4)第31位: 0
(5)第30位: 1
(6)左移4位,4的二进制0011,不足7位则:0000,011
最后得23.172001在计算机中的二进制表现形式为:0100,0001,1011,1001,0110,0000,0100,0010
二进制转16进制得:41A96042
wangfeiwoyun 2011-12-17
  • 打赏
  • 举报
回复
附上那个字符串反转的方法:

static String reverse8BitsHexString(final String source) {
final int length = source.length();

final char[] result = new char[length];

for(int i = length - 1; i > 0; i = i - 2) {
result[length - i - 1] = source.charAt(i - 1);
result[length - i] = source.charAt(i);
}

return new String(result);
}
wangfeiwoyun 2011-12-17
  • 打赏
  • 举报
回复
有个错误:应该是commons-lang.jar,不是commons-long.jar.
老是把lang写成long
wangfeiwoyun 2011-12-17
  • 打赏
  • 举报
回复
"4260b941", 转成"41b96042" 我想应该不难吧。

/*用十六进制的"41b96042",转成一个十进制整数(这个十进制数并不是浮点数):*/
int intValue= Integer.parseInt(str, 16);
/*然后用这个十进制整数得到一个二进制字符串:*/
//结果就是:100 0001 1011 1001 0110 0000 0100 0010
String binaryString = Integer.toBinaryString(intValue);

取到这个2进制数,然后将这个2进制数转成float

//这里只处理规格化数,非规格化数,NaN,finite等没有考虑
static float binaryStringToFloat(final String binaryString) {
// float是32位,将这个binaryString左边补0补足32位,如果是Double补足64位。
final String stringValue = leftPad(binaryString, '0', 32);

// 首位是符号部分,占1位。
// 如果符号位是0则代表正数,1代表负数
final int sign = stringValue.charAt(0) == '0' ? 1 : -1;

// 第2到9位是指数部分,float占8位,double占11位。
final String exponentStr = stringValue.substring(1, 9);

// 将这个二进制字符串转成整数,由于指数部分加了偏移量(float偏移量是127,double是1023)
// 所以实际值要减去127
final int exponent = Integer.parseInt(exponentStr, 2) - 127;

// 最后的23位是尾数部分,由于规格化数,小数点左边隐含一个1,现在加上
final String mantissaStr = "1".concat(stringValue.substring(9, 32));
//这里用double,尽量保持精度,最好用BigDecimal,这里只是方便计算所以用double
double mantissa = 0.0;

for(int i = 0; i < mantissaStr.length(); i++) {
final int intValue = Character.getNumericValue(mantissaStr.charAt(i));
//计算小数部分,具体请查阅二进制小数转10进制数相关资料
mantissa += (intValue * Math.pow(2, -i));
}
// 根据IEEE 754 标准计算:符号位 * 2的指数次方 * 尾数部分
return (float)(sign * Math.pow(2, exponent) * mantissa);
}

// 一个简单的补齐方法,很简单,没考虑很周到。具体请参考common-long.jar/StringUtils.leftPad()
static String leftPad(final String str, final char padChar, int length) {
final int repeat = length - str.length();

if(repeat <= 0) {
return str;
}

final char[] buf = new char[repeat];
for (int i = 0; i < buf.length; i++) {
buf[i] = padChar;
}
return new String(buf).concat(str);
}

内容概要:本文系统研究了开关频率大于谐振频率(fs>fr)工况下,移相混合控制LLC谐振变换器在低压增益区域的工作特性,深入分析其在变频与移相结合控制模式下的调制机理、工作模态划分及损耗分布规律。通过Simulink平台构建高保真仿真模型,对变换器在不同负载和输入条件下的电压增益、转换效率、关键器件电压电流应力等性能指标进行了全面仿真验证,重点探讨了其在低增益区间的软开关实现能力与效率优化潜力,旨在提升LLC变换器在宽范围输入输出应用中的动态响应与能源转换效率。; 适合人群:从事电力电子变换器设计、高频电源开发及相关领域的高校研究生、科研院所研究人员及企业研发工程师,要求具备扎实的电路理论基础、电力电子技术知识以及一定的Simulink仿真能力。; 使用场景及目标:①深入理解LLC谐振变换器在fs>fr条件下采用移相混合控制的内在工作机理与模态转换过程;②掌握利用Simulink搭建复杂谐振变换器精确仿真模型的方法与技巧;③分析并优化低压增益区的增益特性与损耗构成,为设计高效率、高功率密度的软开关电源提供理论依据和数据支持; 阅读建议:建议读者结合文中所述仿真模型,亲自复现仿真过程,重点观察不同控制参数(如移相比、开关频率)对电压增益曲线和关键波形的影响,并对比传统变频控制策略,深入探究混合控制在拓宽调压范围、提升轻载效率方面的优势,从而深化对现代高效谐振电源设计的理解。
内容概要:本文提出了一种基于粒子群优化算法(PSO)的配电网光伏储能双层优化配置模型,以IEEE33节点系统为标准算例,实现光伏发电单元与储能系统的协同选址与定容优化。该模型采用双层架构设计,上层以投资成本、运行经济性及网络损耗最小为目标优化设备配置方案,下层通过潮流计算评估系统在不同负荷场景下的运行性能,综合考虑电压稳定性、供电可靠性及可再生能源消纳能力,最终通过Matlab编程实现完整求解流程,为高渗透率分布式电源接入背景下的配电网规划提供了有效的技术支撑。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、高校科研人员及从事新能源并网、智能配电网规划与优化的工程技术人员。; 使用场景及目标:①研究含高比例光伏接入的配电网规划与运行协同优化问题;②掌握双层优化建模方法与粒子群算法在复杂电力系统问题中的应用技巧;③为实际工程中分布式光伏与储能系统的科学选址与容量配置提供理论依据与仿真验证平台。; 阅读建议:建议读者结合Matlab代码深入理解双层迭代求解机制,重点关注算法收敛性分析、参数敏感性测试,并可通过更换初始种群、调整权重因子或引入其他标准测试系统(如IEEE69节点)进行对比实验,进一步验证所提模型的普适性与鲁棒性。
内容概要:本文围绕双机并联虚拟同步发电机(VSG)在微电网中的功率分配、黑启动、虚拟阻抗与预同步控制展开,基于Simulink平台构建了完整的微电网系统仿真模型。重点研究了VSG在双机并联运行下的有功/无功功率均分控制策略,通过引入虚拟阻抗技术有效解决了因线路阻感比差异导致的功率分配不均问题。同时,设计了微电网黑启动流程与并网预同步控制模块,实现了待并网系统与主网在电压幅值、频率和相位上的精确同步,显著降低了并网冲击电流。系统整合了VSG控制、下垂控制、虚拟阻抗、锁相环(PLL)及预同步逻辑等关键环节,全面验证了多VSG协同运行的稳定性、自主恢复能力与并网可靠性。; 适合人群:具备电力系统、电力电子及自动控制等相关专业知识,从事微电网、分布式发电、VSG控制与并网技术研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解双机并联VSG系统中功率分配不均的机理及虚拟阻抗的补偿作用;②掌握微电网黑启动全过程及预同步控制的关键技术要点;③学习并实践基于Simulink的微电网多层次、多目标控制策略的建模与仿真方法;④为相关科研课题、毕业设计或实际工程项目提供可复现、可拓展的技术方案与仿真参考。; 阅读建议:建议结合提供的Simulink模型文件进行同步学习,重点关注VSG控制参数整定、虚拟阻抗设计原则、预同步切换逻辑等核心模块的实现细节,并可通过改变负载投切、线路参数或初始频率偏差等条件进行多工况仿真测试,以深入探究系统的动态响应特性与鲁棒性。

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧