Java: convertir un binaire à virgule flottante en décimal à virgule flottante
Je veux convertir une chaîne représentant la partie mantisse d'un double IEEE754. Impossible de trouver s'il existe une telle méthode de conversion en Java, afin d'éviter d'ajouter manuellement 1 + 1/2 + 1/4 + 1/8 etc.
|0100000011001010000111110000000000000000000000000000000000000000
--> 13374 dans IEEE754
|------------1010000111110000000000000000000000000000000000000000
> > partie mantisse
| 1.1010000111110000000000000000000000000000000000000000
> > restaurer la valeur fixe 1
String s = "1.1010000111110000000000000000000000000000000000000000"
double mant10 = Double.readFromFloatBinary(s); // does such method exists in Java?
1 answers
Oui, il existe des moyens de lire à partir d'une représentation binaire. Mais vous n'avez pas de représentation dans un format IEEE.
J'ignorerais la période et lirais comme un BigInteger
base2, puis créerais une valeur à diviser en utilisant également 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);
}