web-dev-qa-db-fra.com

BigDecimal setScale and round

Quelle est la différence entre ces deux appels? (Y a-t-il?)

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

La différence entre "précision" et "échelle" et la manière dont elles sont utilisées dans les deux déclarations sont un point important auquel il est fait allusion, mais qui ne sont pas directement abordés. "précision" est le nombre total de chiffres significatifs d’un nombre. "scale" est le nombre de chiffres à droite du séparateur décimal.

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

setScale() accepte évidemment scale en tant qu'argument, de même que RoundingMode, mais la précision n'est jamais spécifiée dans la deuxième instruction.

Si vous déplacez le point décimal d'un endroit à droite, la différence deviendra 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
194
dale peters

Il y a en effet une grande différence, que vous devriez garder à l'esprit. setScale définit vraiment l'échelle de votre nombre alors que round arrondit votre nombre aux chiffres spécifiés MAIS il "commence par le chiffre le plus à gauche 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 plutôt 0.0034. Voici ma note à ce sujet sur mon blog:

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

51
user817756