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()
?
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.
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.
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 long
s et optimisée pour la valeur fréquemment utilisée de long
s. C'est donc plus standard, simple et facile à retenir.