Java:如何将二进制值的字符串转换为浮点数,反之亦然?

5

如何将浮点数的值12345.12346f转换为二进制值的字符串,例如"0011010101010101",反之亦然?


你想要这个浮点数在内存中的表示吗?因为浮点数并没有真正的二进制表示,整数有,但浮点数没有。 - krtek
你只是想要任何可逆转换,还是一个明智的(或者说可读性强的)转换? - Paŭlo Ebermann
4个回答

15

我不确定这是否是您想要的,但以下是一个解决方案,可以获取IEEE 754浮点“双精度格式”位布局的二进制表示形式,以获取浮点数的内存表示:

int intBits = Float.floatToIntBits(yourFloat); 
String binary = Integer.toBinaryString(intBits);

对于反向过程:

int intBits = Integer.parseInt(myString, 2);
float myFloat = Float.intBitsToFloat(intBits);

Integer.parseLong不存在。 - okami
谢谢您的纠正 :) 这是我第一次尝试使用 long 而不是 int。 - krtek
结果是有符号的还是无符号的?需要有符号的。 - munchschair
经过数小时的搜索和尝试,我找到了你的答案。按照预期工作。非常感谢! - Al0x
我和提问者几乎有相同的问题。我有一个通信模拟器,它生成二进制数据,被监听进程“捕获”。我从“float flt = -45732.9287f”开始,可以看到接收到的二进制数据是正确的,但是使用这个解决方案将其转换回Float时会抛出“java.lang.NumberFormatException: For input string: "11000111001100101010010011101110" from "java.lang.Integer.parseInt(Integer.java:583)".” 显然生成的二进制数据是符合IEEE-754 binary32格式的,来自于对“int revint = Integer.parseInt(str, 2);”的调用。 - CelticPoet

3

工作样例:

class F { 
  public static void main( String ... args ) { 
    System.out.println(
          Integer.toBinaryString( 
             Float.floatToIntBits(12345.12346f)
          ) 
     );
  }
}

输出:

1000110010000001110010001111110

3

对于带符号的浮点数,请使用Long或BigInteger解析字符串。通过int强制转换会导致32位第一个数字被解释为符号数字。

int intBits = Float.floatToIntBits(yourFloat); 
String binary = Integer.toBinaryString(intBits);

反转过程:

int intBits = new BigInteger(myString, 2).intValue();
// int intBits = (int) Long.parseLong(myString, 2);
float myFloat = Float.intBitsToFloat(intBits);

0

您可以使用以下方法获取Java Float值的位表示:

Float.floatToIntBits(float f);

完成这个步骤后,你可以逐位测试结果中的每一个二进制位,从最高位开始,判断它是否为1,如果是则写入'1',否则写入'0'。


有一个 Integer.toBinaryString(intBits) 方法可以将整数转换为二进制字符串表示。 - krtek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接