Подтвердить что ты не робот

Java, извлекает только дробную часть BigDecimal?

В Java я работаю с классом BigDecimal, и часть моего кода требует, чтобы я извлек из него дробную часть. BigDecimal, похоже, не имеет встроенных методов, чтобы помочь мне получить число после десятичной точки BigDecimal.

Например:

BigDecimal bd = new BigDecimal("23452.4523434");

Я хочу извлечь 4523434 из числа, представленного выше. Какой лучший способ сделать это?

4b9b3361

Ответ 1

Я бы попробовал bd.remainder(BigDecimal.ONE).

Использует метод remainder и ONE константа.

BigDecimal bd = new BigDecimal( "23452.4523434" );
BigDecimal fractionalPart = bd.remainder( BigDecimal.ONE ); // Result:  0.4523434

Ответ 2

Если значение отрицательное, использование bd.subtract() вернет неправильное десятичное число.

Используйте этот:

BigInteger decimal = 
                bd.remainder(BigDecimal.ONE).movePointRight(bd.scale()).abs().toBigInteger();

Он возвращает 4523434 для 23452.4523434 или -23452.4523434


Кроме того, если вам не нужны дополнительные нули справа от дробной части, используйте:

bd = bd.stripTrailingZeros();

перед предыдущим кодом.

Ответ 3

Здесь альтернатива использованию метода remainder():

BigDecimal bd = new BigDecimal("23452.4523434");
BigDecimal fracBd = bd.subtract(new BigDecimal(bd.toBigInteger()));

Кроме того, вы можете попробовать метод abs() для обеспечения положительной части дроби:

BigDecimal fracBd = bd.subtract(new BigDecimal(bd.toBigInteger())).abs();

Ответ 4

Возврат "4523434", даже если вы установите отрицательный номер "-23452.4523434".

 BigDecimal d = BigDecimal.valueOf(23452.4523434);
 BigInteger decimal = d.remainder(BigDecimal.ONE).movePointRight(d.scale()).abs().toBigInteger();

Ответ 5

Не работает !!!

BigDecimal d = BigDecimal.valueOf(23452.4523434);
BigInteger decimal = 
d.remainder(BigDecimal.ONE).movePointRight(d.scale()).abs().toBigInteger();

Когда вы вводите число, которое дробная часть начинается с "0", например. "123,00456". Вы получаете "456" вместо "00456". Это происходит потому, что мы конвертируем его .toBigInteger(), и первые нули только что ушли; Если вы используете .toString() вместо .toBigInteger(), вы получите 456.00000, это тоже неправильно!

Поэтому я советую использовать это:

BigDecimal fractPart = bd.remainder(BigDecimal.ONE);
StringBuilder sb = new StringBuilder(fractPart.toString());
sb.delete(0, 2);
String str = sb.toString();

А потом просто используйте эту str как вы хотите