Je suis tombé sur deux façons de sortir un objet BigDecimal d'un double d.
1. new BigDecimal(d)
2. BigDecimal.valueOf(d)
Quelle serait la meilleure approche? ValueOf créerait-il un nouvel objet?
En général (pas seulement BigDecimal), qu'est-ce qui est recommandé - nouveau ou valueOf?
Merci.
java
bigdecimal
Manish Mulani
la source
la source
Réponses:
Ce sont deux questions distinctes: "Pour quoi dois-je utiliser
BigDecimal
?" et "Que dois-je faire en général?"Pour
BigDecimal
: c'est un peu délicat, car ils ne font pas la même chose .BigDecimal.valueOf(double)
utilisera la représentation canoniqueString
de ladouble
valeur transmise pour instancier l'BigDecimal
objet. En d'autres termes: la valeur de l'BigDecimal
objet sera ce que vous voyez lorsque vous le faitesSystem.out.println(d)
.Si vous utilisez
new BigDecimal(d)
cependant, alorsBigDecimal
essaiera de représenter ladouble
valeur aussi précisément que possible . Cela entraînera généralement le stockage de beaucoup plus de chiffres que vous ne le souhaitez. À proprement parler, c'est plus correct quevalueOf()
, mais c'est beaucoup moins intuitif.Il y a une belle explication à cela dans le JavaDoc:
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), alorsvalueOf()
devrait être préféré: il peut faire la mise en cache des valeurs communes (comme on le voit surInteger.valueOf()
) et il peut même changer le comportement de mise en cache sans l'appelant doit être changé.new
sera toujours instancier une nouvelle valeur, même si pas nécessaire (meilleur exemple: parnew Boolean(true)
rapportBoolean.valueOf(true)
).la source
new BigDecimal()
mieux queBigDecimal.valueOf()
?new BigDecimal()
serait préféré et un exemple de quandBigDecimal.valueOf()
serait préféré?new BigDecimal(1.0/30.0);
etBigDecimal.valueOf(1.0/30.0)
. Voir quel résultat est en fait plus proche de la fraction numérique 1/30.Si vous utilisez vos
BigDecimal
objets pour stocker des valeurs monétaires, je vous recommande fortement de ne PAS impliquer de valeurs doubles dans leurs calculs.Comme indiqué dans une autre réponse, il existe des problèmes de précision connus avec des valeurs doubles et ceux-ci reviendront vous hanter beaucoup.
Une fois que vous avez passé cela, la réponse à votre question est simple. Utilisez toujours la méthode constructeur avec la valeur String comme argument du constructeur, car il n'y a pas de
valueOf
méthode pourString
.Si vous voulez une preuve, essayez ce qui suit:
Vous obtiendrez la sortie suivante:
Voir aussi cette question connexe
la source
Fondamentalement, valueOf (double val) fait simplement ceci:
return new BigDecimal(Double.toString(val));
Par conséquent -> oui, un nouvel objet sera créé :).
En général, je pense que cela dépend de votre style de codage. Je ne mélangerais pas valueOf et "new", si les deux sont le même résultat.
la source
valueOf()
a le comportement le plus intuitif , tandis qu'ilnew BigDecimal(d)
a le plus correct . Essayez les deux et voyez la différence.new BigDecimal(1) != new BigDecimal(1)
maisBigDecimal.valueOf(1) == BigDecimal.valueOf(1)
BigDecimal
est immuable , il doit être traité de la même manière que les emballages primitifs (Integer
,Byte
, ...) etString
sont traités: l' identité de l' objet ne doit pas question à votre code, seule la valeur devrait être importante.valueOf()
devrait généralement être préféré. Mais notez queBigDecimal.valueOf(double)
cela ne fait aucune mise en cache (et cela n'en vaudrait probablement pas la peine non plus).