133 votes

BigDecimal setScale et ronde

Quelle est la différence entre ces deux appels? (Est-il?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);

203voto

dale peters Points 419

Un point important qu'il est fait allusion, mais pas directement abordé est la différence entre la "précision" et "échelle" et la façon dont ils sont utilisés dans les deux états. "précision" est le nombre total de chiffres dans un nombre. "l'échelle" est le nombre de chiffres à droite du point décimal.

Le MathContext constructeur accepte uniquement précision et RoundingMode comme arguments, et, par conséquent, l'échelle n'est jamais spécifié dans la première instruction.

setScale() évidemment accepte l'échelle comme un argument, ainsi que RoundingMode, cependant la précision est jamais précisé dans la deuxième instruction.

Si vous déplacez la virgule d'un endroit pour le droit, la différence sera plus claire:

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456

51voto

user817756 Points 344

Il y a en effet une grande différence, que vous devriez garder à l'esprit. setScale vraiment définir l'échelle de votre nombre, alors que les balles ne le tour de votre nombre spécifié de chiffres, MAIS il "commence à partir de la gauche chiffres du résultat exact", comme indiqué dans le jdk. Donc en ce qui concerne votre échantillon, les résultats sont les mêmes, mais essayez 0.0034 à la place. Voici ma note à ce sujet sur mon blog:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X