web-dev-qa-db-fra.com

Java, extraire juste la partie fractionnaire d'un BigDecimal?

En Java, je travaille avec la classe BigDecimal et une partie de mon code me demande d'en extraire la partie fractionnaire. BigDecimal ne semble pas avoir de méthodes intégrées pour m'aider à obtenir le nombre après la virgule décimale d'un BigDecimal.

Par exemple:

BigDecimal bd = new BigDecimal("23452.4523434");

Je veux extraire le 4523434 à partir du nombre représenté ci-dessus. Quelle est la meilleure façon de procéder?

56
Franklin

J'essaierais bd.remainder(BigDecimal.ONE).

Utilise la méthode remainder et la constante ONE .

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

Si la valeur est négative, l'utilisation de bd.subtract() renverra une décimale incorrecte.

tilisez ceci:

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

Il renvoie 4523434 pour 23452.4523434 ou -23452.4523434


De plus, si vous ne voulez pas de zéros supplémentaires à droite de la partie fractionnaire, utilisez:

bd = bd.stripTrailingZeros();

avant le code précédent.

13
IvanRF

Voici une alternative à l'utilisation de la méthode remainder():

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

De plus, vous pouvez essayer la méthode abs () pour vous assurer que la partie fraction est positive:

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

Cela renvoie "4523434", même si vous définissez le nombre en négatif "-23452.4523434".

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

Ça ne marche pas !!!

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

Lorsque vous entrez un nombre, quelle partie fractionnaire commence par '0', par exemple. "123.00456". Vous obtenez "456" au lieu de "00456". Cela se produit parce que nous le convertissons .toBigInteger(), et les premiers zéros viennent de disparaître; Si vous utilisez .toString() au lieu de .toBigInteger(), vous obtenez 456.00000, c'est mal aussi!

Donc, mon conseil est en utilisant cela:

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

Et puis utilisez simplement cette str comme vous voulez

0
MainS