web-dev-qa-db-fra.com

Convertir Java Nombre en BigDecimal: meilleur moyen

Je cherche le meilleur moyen de convertir un nombre en BigDecimal.

Est-ce suffisant?

Number number;
BigDecimal big = new BigDecimal(number.toString());

Pouvons-nous perdre de la précision avec la méthode toString()?

52
user1721413

C'est bien, rappelez-vous que l'utilisation du constructeur de BigDecimal pour déclarer une valeur peut être dangereuse si elle n'est pas de type String. Considérez le ci-dessous ...

BigDecimal valDouble = new BigDecimal(0.35);
System.out.println(valDouble);

Ce ne sera pas imprimer 0.35, il sera en fait être ...

0.34999999999999997779553950749686919152736663818359375

Je dirais que votre solution est probablement la plus sûre à cause de cela.

34
david99world

Pouvons-nous perdre de la précision avec la méthode toString ()?

Type de ... Float.toString() et Double.toString() ne fournissent que le nombre de chiffres après le séparateur décimal, ce qui est nécessaire pour que la sortie corresponde uniquement à une valeur float ou double.

Pour utiliser l'exemple 0.35 dans la réponse de david99world, considérons le code suivant:

BigDecimal bd1 = new BigDecimal(0.35);

Number n = 0.35;
BigDecimal bd2 = new BigDecimal(n.toString());

System.out.println(bd1);
System.out.println(bd2);

Une attente intuitive peut être que les deux instances BigDecimal sont identiques, mais la sortie indique qu'elles ne le sont pas:

0.34999999999999997779553950749686919152736663818359375
0.35

La première ligne est la valeur exacte du double, car 0,35 ne peut pas être représenté exactement. La deuxième ligne est 0,35, puisqu’il n’ya plus besoin de chiffres fractionnaires pour représenter la valeur distincte. Par exemple. la déclaration 0.34999999999999997779553950749686919152736663818359375 == 0.35 sera évalué à true.

Ce n’est en réalité pas une perte de précision lors de la création du BigDecimal, l’incertitude est déjà présente dans votre valeur "source". Le problème est plutôt que les valeurs discrètes possibles utilisant par exemple une valeur float ou double en tant que source ne sera pas nécessairement représentée par son équivalent exact dans l'instance BigDecimal.

19
jarnbjo

Le meilleur moyen est

BigDecimal.valueOf(myDouble);

C'est la même chose en interne, mais c'est une fonction surchargée qui fonctionne aussi pour longs et optimisée pour la valeur fréquemment utilisée de longs. C'est donc plus standard, simple et facile à retenir.

Source

0
Marco Sulla