Ответ 1
Я бы попробовал bd.remainder(BigDecimal.ONE)
.
Использует метод remainder
и ONE
константа.
BigDecimal bd = new BigDecimal( "23452.4523434" );
BigDecimal fractionalPart = bd.remainder( BigDecimal.ONE ); // Result: 0.4523434
В Java я работаю с классом BigDecimal
, и часть моего кода требует, чтобы я извлек из него дробную часть. BigDecimal
, похоже, не имеет встроенных методов, чтобы помочь мне получить число после десятичной точки BigDecimal
.
Например:
BigDecimal bd = new BigDecimal("23452.4523434");
Я хочу извлечь 4523434
из числа, представленного выше. Какой лучший способ сделать это?
Я бы попробовал bd.remainder(BigDecimal.ONE)
.
Использует метод remainder
и ONE
константа.
BigDecimal bd = new BigDecimal( "23452.4523434" );
BigDecimal fractionalPart = bd.remainder( BigDecimal.ONE ); // Result: 0.4523434
Если значение отрицательное, использование bd.subtract()
вернет неправильное десятичное число.
Используйте этот:
BigInteger decimal =
bd.remainder(BigDecimal.ONE).movePointRight(bd.scale()).abs().toBigInteger();
Он возвращает 4523434
для 23452.4523434
или -23452.4523434
Кроме того, если вам не нужны дополнительные нули справа от дробной части, используйте:
bd = bd.stripTrailingZeros();
перед предыдущим кодом.
Здесь альтернатива использованию метода 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();
Возврат "4523434", даже если вы установите отрицательный номер "-23452.4523434".
BigDecimal d = BigDecimal.valueOf(23452.4523434);
BigInteger decimal = d.remainder(BigDecimal.ONE).movePointRight(d.scale()).abs().toBigInteger();
Не работает !!!
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
как вы хотите