web-dev-qa-db-fra.com

Convertir une chaîne en BigDecimal en java

Je lis une devise de XML en Java. 

String currency = 135.69;

Quand je convertis ceci en BigDecimal je reçois:

 System.out.println(new BigDecimal(135.69));

Sortie:

135.68999999999999772626324556767940521240234375.

Pourquoi est-ce qu'il sort autant de nombres? Comment puis-je éviter ça? Tout ce que je veux, c'est que cela produise 135.69.

22
Hari Rao

Le constructeur BigDecimal (double) a quelques problèmes, il est préférable que vous utilisiez BigDecimal (String) ou BigDecimal.valueOf (double).

System.out.println(new BigDecimal(135.69)); //135.68999999999999772626324556767940521240234375
System.out.println(new BigDecimal("135.69")); // 135.69
System.out.println(BigDecimal.valueOf(135.69)); // 135.69

La documentation BigDecimal (double) explique ce comportement:

  1. Les résultats de ce constructeur peuvent être quelque peu imprévisibles. On peut supposer que l’écriture du nouveau BigDecimal (0.1) en Java crée un BigDecimal qui est exactement égal à 0,1 (une valeur non mise à l’échelle de 1, avec une échelle de 1), mais qui est en réalité égale à 0.1000000000000000055515151212578270211151545454101525. En effet, 0.1 ne peut pas être représenté exactement par un double (ni même par une fraction binaire d'une longueur finie). Ainsi, la valeur transmise au constructeur n’est pas exactement égale à 0,1, nonobstant les apparences.
  2. Le constructeur String, quant à lui, est parfaitement prévisible: l'écriture d'un nouveau BigDecimal ("0.1") crée un BigDecimal qui est exactement égal à 0,1, comme on pouvait s'y attendre. Par conséquent, il est généralement recommandé d’utiliser le constructeur String de préférence à celui-ci.
  3. Lorsqu'un double doit être utilisé comme source pour un BigDecimal, notez que ce constructeur fournit une conversion exacte; cela ne donne pas le même résultat que de convertir le double en String en utilisant la méthode Double.toString (double), puis en utilisant le constructeur BigDecimal (String). Pour obtenir ce résultat, utilisez la méthode statique valueOf (double). 
55
Marlon Patrick
String currency = "135.69";
System.out.println(new BigDecimal(currency));

//will print 135.69
11
Sireesh Vattikuti

Puis-je ajouter quelque chose. Si vous utilisez la devise, vous devez utiliser Scale (2) et vous devriez probablement trouver une méthode de ronde. 

2
Juan Diego

Vous stockez 135.69 sous forme de chaîne dans la devise. Mais au lieu de passer la devise variable, vous passez à nouveau 135,69 (double valeur) dans le nouveau BigDecimal () . Vous voyez donc beaucoup de nombres dans la sortie . Si vous passez la variable monétaire, votre sortie être 135.69

2
sandeep

Salut les gars, vous ne pouvez pas convertir directement chaîne en bigdecimal 

vous devez d'abord le convertir longtemps après que vous convertissiez une grande décimale 

Chaîne devise = "135.69"; Long rate1 = Long.valueOf ((currency));

    System.out.println(BigDecimal.valueOf(rate1));
0
baisakhi chauhan