web-dev-qa-db-fra.com

BigDecimal en chaîne

J'ai un objet BigDecimal et je veux le convertir en chaîne . Le problème est que ma valeur a une fraction et que je reçois un nombre énorme (en longueur) et que je n'ai besoin que du nombre d'origine 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 de sortir pour être exactement le nombre 10.0001 dans la chaîne

50
Yo Al

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 une double et il arrive que les doublons 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 montre votre BigDecimal.

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

Vous pouvez en lire plus à ce sujet ici, Déplacer les décimales dans un double

103
assylias

Votre BigDecimal ne contient pas le nombre 10.0001, car vous l'avez initialisé avec un double, et le double n'a pas tout à fait contient le nombre que vous pensiez être le cas. (C’est l’intérêt de BigDecimal.)

Si vous utilisez le constructeur basé sur une chaîne à la place:

BigDecimal bd = new BigDecimal("10.0001");

... alors il contiendra réellement le nombre que vous attendez.

10
T.J. Crowder

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 dans String: 10.0001

6
Saminathan

Pour une meilleure prise en charge, les différentes régions utilisent la méthode suivante

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

df.format(bigDecimal);

aussi vous pouvez le personnaliser:

DecimalFormat df = new DecimalFormat("###,###,###");
df.format(bigDecimal);
3
Atetc
// 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);
1
Rzgar

Si vous devez simplement définir la quantité de précision et arrondir la valeur, la bonne façon de le faire est d'utiliser son propre objet pour cela.

BigDecimal value = new BigDecimal("10.0001");
value = value.setScale(4, RoundingMode.HALF_UP);
System.out.println(value); //the return should be "10.0001"

L'un des piliers de la programmation orientée objet (POO) est "l'encapsulation". Ce pilier indique également qu'un objet doit gérer ses propres opérations, comme suit:

0
Sham Fiorin

Pour archiver le résultat nécessaire avec un constructeur double, vous devez arrondir BigDecimal avant de le convertir en chaîne, par exemple.

new Java.math.BigDecimal (10.0001) .round (new Java.math.MathContext (6, Java.math.RoundingMode.HALF_UP)). toString ()

imprimera le "10.0001"

0
foal

Le BigDecimal ne peut pas être un double . Vous pouvez utiliser Int number . Si vous voulez afficher un nombre exact, vous pouvez utiliser le constructeur String de BigDecimal.

comme ça:

BigDecimal bd1 = new BigDecimal("10.0001");

maintenant, vous pouvez afficher bd1 sous la forme 10.0001

Si simple . BONNE CHANCE.

0
Sajad