2012-04-06 8 views
44

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

Например:

BigDecimal bd = new BigDecimal("23452.4523434"); 

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

ответ

67

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

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

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

@Franklin - пожалуйста, не принимайте мой ответ и вместо этого принимайте ответ Таймона, поскольку он чище и лучше, чем мой. 1+ к Таймону. –

+6

Код текущего решения вернет «0.4523434», а не «4523434», как хотел автор. Требуется еще несколько ходов. –

+1

его важно получить только «4523434», в некоторых случаях этот ответ не возвращает правильный результат, также должен печатать вывод. –

7

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

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

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

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

Гораздо лучше, чем комплексный метод «остаток» – marcolopes

+0

Вычитание без математического контекста может привести к некоторым интересным результатам. – Ishmael

+0

Не извлекает только «4523434», это неправильный ответ –

5

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

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

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

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


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

bd = bd.stripTrailingZeros(); 

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

+0

Хотя ваш код является правильным формально, это не так. Представьте, что вход - BigDecimal ("123.45"). SetScale (6) ', тогда вы получите' 450000'. Вряд ли полезный результат. –

+0

@PavelVlasov это число будет по-прежнему дробной частью, что является исходным вопросом. Каждый ноль справа от «дробной части» бесполезен, поэтому «45» или «450000» равны в этом контексте. – IvanRF

+1

@PavelVlasov, чтобы решить ваш случай, примените 'bd = bd.stripTrailingZeros();' перед моим кодом. – IvanRF

2

Это возвращение «4523434», даже если вы установили число отрицательным «-23452.4523434».

BigDecimal d = BigDecimal.valueOf(23452.4523434); 
BigInteger decimal = d.remainder(BigDecimal.ONE).movePointRight(d.scale()).abs().toBigInteger(); 
Смежные вопросы