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);
java
bigdecimal
utilisateur
la source
la source
round
méthode renvoie également une nouvelle instance de BigDecimal car, comme vous l'avez dit, les instances sont immuables.Réponses:
Un point important auquel on fait allusion mais qui n'est pas directement abordé est la différence entre «précision» et «échelle» et comment ils sont utilisés dans les deux énoncés. «précision» est le nombre total de chiffres significatifs dans un nombre. «échelle» est le nombre de chiffres à droite de la virgule décimale.
Le constructeur MathContext n'accepte que la précision et RoundingMode comme arguments et, par conséquent, l'échelle n'est jamais spécifiée dans la première instruction.
setScale()
accepte évidemment l'échelle comme argument, ainsi que RoundingMode, mais la précision n'est jamais spécifiée dans la deuxième instruction.Si vous déplacez la virgule décimale d'une place vers la droite, la différence deviendra claire:
la source
Il y a en effet une grande différence que vous devez 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 à partir du chiffre le plus à gauche du résultat exact" comme mentionné 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
la source