2016-12-27 7 views
0

Мне нужен совет, как правильно преобразовать отрицательную дробную часть в двоичную. Мой пользовательский тип данных с фиксированной точкой необходимо преобразовать в byte[]. Таким образом, в настоящее время мне нужно осуществить такое преобразование:Отрицательная доля Java BigDecimal до двоичной формы

BigDecimal -> byte[] -> BigDecimal 

Как я понимаю, фракция имеет ту же форму, как 2's complement целую часть, не так ли? Как можно отличить «plain -1» от отрицательной доли? Краткосрочный пример примера будет очень полезен.

Как написать -1.375 и -0.375 в двоичном формате?

+2

Почему? Это необходимо? Это похоже на проблему XY ... – AxelH

+0

Yeap, это необходимо. – Constantine

+0

Предположим, что вам действительно нужно использовать байт [] ... не видите потребности здесь (это сериализуется, вы знаете), но вы, вероятно, можете найти свой ответ [здесь] (http://stackoverflow.com/questions/6167697/how-to-convert-java-bigdecimal-to-normal-byte-array-not-2s-дополнение) – AxelH

ответ

0

Я думаю, что вы можете закодировать, как (обновлено):

Преобразовать в байт []

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    DataOutputStream dos = new DataOutputStream(bos); 
    BigDecimal d = BigDecimal.valueOf(-0.00390625); 
    dos.writeInt(d.scale()); 
    dos.write(d.unscaledValue().toByteArray()); 
    dos.close(); // flush 
    byte[] array = bos.toByteArray(); 

Преобразовать из байт []

ByteArrayInputStream bis = new ByteArrayInputStream(array); 
    DataInputStream dis = new DataInputStream(bis); 
    int sc = dis.readInt(); //grab 4 bytes 
    BigInteger unscaledVal = new BigInteger(Arrays.copyOfRange(array, 4, array.length)); 
    System.out.println(new BigDecimal(unscaledVal, sc)); 

Примечание: вероятно, вы хотели бы сохранить BigDecimal длина массива.

+0

Это актуально дает мне неправильный результат: для -0.00390625 (наименее отрицательный для 8-битной дроби) конвертация возвращает 0.16386591 Просто не удается найти четкий алгоритм обработки отрицательных дробей. Я чувствую, что он существует) – Constantine

+0

См. Мое обновление. Нам нужно также «масштабировать», чтобы правильно восстановить «BigDecimal» – krzydyn

+0

, потому что unscaledValue просто выполняет 'bd.value * 10^bd.scale'. – AxelH