Ce sont deux questions distinctes : "Que dois-je utiliser pour BigDecimal
?" et "Que dois-je faire en général ?"
Pour BigDecimal
: c'est un peu délicat, parce qu'elles ne faites pas la même chose . BigDecimal.valueOf(double)
utilisera le canonique String
représentation de la double
transmise pour instancier le BigDecimal
objet. En d'autres termes : La valeur de l'objet BigDecimal
sera ce que vous verrez quand vous ferez System.out.println(d)
.
Si vous utilisez new BigDecimal(d)
cependant, alors le BigDecimal
tentera de représenter le double
valeur de manière aussi précise que possible . Cela permettra généralement entraîne le stockage de beaucoup plus de chiffres que vous ne le souhaitez. Strictement parlant, c'est plus correct que valueOf()
mais c'est beaucoup moins intuitif.
Il y a une bonne explication à ce sujet dans la JavaDoc :
Les résultats de ce constructeur peuvent être quelque peu imprévisibles. On pourrait supposer qu'écrire new BigDecimal(0.1)
en Java crée un BigDecimal
qui est exactement égal à 0,1 (une valeur non échelonnée de 1, avec une échelle de 1), mais il est en fait égal à 0,100000000000055511151231257827021181583404541015625. Cela est dû au fait que 0,1 ne peut pas être représenté exactement comme un double
(ou, d'ailleurs, comme une fraction binaire de longueur finie). Ainsi, la valeur qui est transmise au constructeur n'est pas exactement égale à 0,1, malgré les apparences.
En général, si le résultat est le même (c'est-à-dire pas dans le cas de BigDecimal
mais dans la plupart des autres cas), alors valueOf()
devrait être préférée : elle permet de mettre en cache des valeurs communes (comme on le voit sur Integer.valueOf()
) et il peut même modifier le comportement de la mise en cache sans que l'appelant doive être modifié. new
sera toujours instancier une nouvelle valeur, même si ce n'est pas nécessaire (meilleur exemple : new Boolean(true)
contra. Boolean.valueOf(true)
).
10 votes
En général, valueOf est préférable (parce qu'il permet d'éviter de créer de nouveaux objets en réutilisant des instances "populaires"), mais dans le cas de BigDecimals et de double, malheureusement, les deux méthodes produisent des résultats différents, vous devez donc choisir celle dont vous avez besoin.