我想转换表示 IEEE754 双精度数尾数部分的字符串。
找不到Java中是否有这样的转换方法,以避免手动添加1 + 1/2 + 1/4 + 1/8等。
|0100000011001010000111110000000000000000000000000000000000000000
--> IEEE754 中的 13374|------------1010000111110000000000000000000000000000000000000000
--> 尾数部分| 1.1010000111110000000000000000000000000000000000000000
--> 恢复固定值1
String s = "1.1010000111110000000000000000000000000000000000000000"
double mant10 = Double.readFromFloatBinary(s); // does such method exists in Java?
是的,有多种方法可以读取二进制表示形式。但您没有 IEEE 格式的表示形式。
我会忽略句号并将其读为BigInteger
base2,然后创建一个值来除以也使用BigInteger
:
private static double binaryStringToDouble(String s) {
return stringToDouble(s, 2);
}
private static double stringToDouble(String s, int base) {
String withoutPeriod = s.replace(".", "");
double value = new BigInteger(withoutPeriod, base).doubleValue();
String binaryDivisor = "1" + s.split("\\.")[1].replace("1", "0");
double divisor = new BigInteger(binaryDivisor, base).doubleValue();
return value / divisor;
}
@Test
public void test_one_point_5() {
String s = "1.1";
double d = binaryStringToDouble(s);
assertEquals(1.5, d, 0.0001);
}
@Test
public void test_6_8125() {
String s = "110.1101";
double d = binaryStringToDouble(s);
assertEquals(6.8125, d, 0.0001);
}
@Test
public void test_yours() {
String s = "1.1010000111110000000000000000000000000000000000000000";
double d = binaryStringToDouble(s);
assertEquals(1.632568359375, d, 0.000000000000000001);
}
@Test
public void test_yours_no_trailing_zeros() {
String s = "1.101000011111";
double d = binaryStringToDouble(s);
assertEquals(1.632568359375, d, 0.000000000000000001);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)