71 votes

BigDecimal vers chaîne de caractères

J'ai un objet BigDecimal et je veux le convertir en chaîne de caractères. Le problème est que ma valeur a été fractionnée et j'obtiens un nombre énorme (en longueur) et je n'ai besoin que du nombre original en chaîne par exemple : pour

BigDecimal bd = new BigDecimal(10.0001)
System.out.println(bd.toString());
System.out.println(bd.toPlainString());

la sortie est :

10.000099999999999766941982670687139034271240234375
10.000099999999999766941982670687139034271240234375

et j'ai besoin que la sortie soit exactement le même nombre. 10.0001 à la chaîne

135voto

assylias Points 102015

Pour obtenir exactement 10.0001 vous devez utiliser le constructeur String ou valueOf (qui construit un BigDecimal basé sur la représentation canonique du double) :

BigDecimal bd = new BigDecimal("10.0001");
System.out.println(bd.toString()); // prints 10.0001
//or alternatively
BigDecimal bd = BigDecimal.valueOf(10.0001);
System.out.println(bd.toString()); // prints 10.0001

Le problème avec new BigDecimal(10.0001) est que l'argument est un double et il arrive que les doubles ne puissent pas représenter 10.0001 exactement. Donc 10.0001 est "transformé" en un double le plus proche possible, qui est 10.000099999999999766941982670687139034271240234375 et c'est ce que votre BigDecimal montre.

Pour cette raison, il est rarement utile d'utiliser le constructeur double.

Vous pouvez en savoir plus à ce sujet ici, Déplacement des décimales dans un double

13voto

T.J. Crowder Points 285826

Votre BigDecimal ne contient pas le nombre 10.0001 parce que vous l'avez initialisé avec un double et le double n'a pas tout à fait contient le nombre que vous pensiez qu'il contenait. (C'est tout l'intérêt de BigDecimal .)

Si vous utilisez le constructeur basé sur les chaînes de caractères à la place :

BigDecimal bd = new BigDecimal("10.0001");

...alors il contiendra effectivement le nombre que vous attendez.

9voto

Atetc Points 817

Pour une meilleure prise en charge des différentes langues, utilisez cette méthode :

DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
df.setMinimumFractionDigits(0);
df.setGroupingUsed(false);

df.format(bigDecimal);

Vous pouvez également le personnaliser :

DecimalFormat df = new DecimalFormat("###,###,###");
df.format(bigDecimal);

8voto

Saminathan Points 91

En utilisant la méthode ci-dessous, vous pouvez convertir java.math.BigDecimal en String.

   BigDecimal bigDecimal = new BigDecimal("10.0001");
   String bigDecimalString = String.valueOf(bigDecimal.doubleValue());
   System.out.println("bigDecimal value in String: "+bigDecimalString);

Sortie :
valeur bigDecimal en String : 10.0001

1voto

Rzgar Points 11
// Convert BigDecimal number To String by using below method //

public static String RemoveTrailingZeros(BigDecimal tempDecimal)
{
    tempDecimal = tempDecimal.stripTrailingZeros();
    String tempString = tempDecimal.toPlainString();
    return tempString;
}

// Recall RemoveTrailingZeros
BigDecimal output = new BigDecimal(0);
String str = RemoveTrailingZeros(output);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X