Question Convertir une chaîne en BigDecimal en Java


Je lis une monnaie de XML en Java.

String currency = 135.69;

Lorsque je convertis cela en BigDecimal Je reçois:

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

Sortie:

135.68999999999999772626324556767940521240234375.

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


10
2018-02-28 16:20


origine


Réponses:


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 pourrait supposer que l'écriture d'un nouveau BigDecimal (0.1) en Java crée un BigDecimal qui est exactement égal à 0.1 (une valeur non calibrée de 1, avec une échelle de 1), mais il est en réalité égal à 0.1000000000000000055511151231257827021181583404541015625. C'est parce que 0.1 ne peut pas être représenté exactement comme un double (ou, par conséquent, comme une fraction binaire de toute longueur finie). Ainsi, la valeur transmise au constructeur n'est pas exactement égale à 0,1, nonobstant les apparences.
  2. Le constructeur String, par contre, est parfaitement prévisible: l'écriture d'un nouveau BigDecimal ("0.1") crée un BigDecimal qui est exactement égal à 0.1, comme on peut 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; Il ne donne pas le même résultat que la conversion du double en chaîne à l'aide de la méthode Double.toString (double), puis en utilisant le constructeur BigDecimal (String). Pour obtenir ce résultat, utilisez la méthode static valueOf (double).

33
2018-02-28 16:42



String currency = "135.69";
System.out.println(new BigDecimal(currency));

//will print 135.69

7
2018-02-28 17:09



Puis-je ajouter quelque chose. Si vous utilisez des devises, vous devez utiliser Echelle (2), et vous devriez probablement trouver une méthode ronde.


0
2018-03-06 17:50