web-dev-qa-db-ja.com

Java、BigDecimalの小数部分のみを抽出しますか?

Javaでは、BigDecimalクラスを使用しているため、コードの一部で小数部分を抽出する必要があります。 BigDecimalには、BigDecimalの小数点以下の数値を取得するのに役立つ組み込みメソッドはないようです。

例えば:

BigDecimal bd = new BigDecimal("23452.4523434");

上記の数値から4523434を抽出したい。それを行う最良の方法は何ですか?

56
Franklin

bd.remainder(BigDecimal.ONE)を試します。

remainder メソッドと ONE 定数を使用します。

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

値が負の場合、bd.subtract()を使用すると間違った小数が返されます。

これを使用

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

4523434または23452.4523434に対して-23452.4523434を返します


さらに、小数部の右側に余分なゼロを追加したくない場合は、次を使用します。

bd = bd.stripTrailingZeros();

前のコードの前。

13
IvanRF

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();
7
shams

負の「-23452.4523434」で数値を設定した場合でも、これは「4523434」を返します。

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

うまくいきません!!!

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

Exの場合、「0」で始まる小数部分を入力するとき。 「123.00456」。 「00456」の代わりに「456」が表示されます。 .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を使用してください

0
MainS