BigDecimal setScale et rond

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); 

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

Le constructeur MathContext accepte uniquement 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, cependant la précision n’est jamais spécifiée dans la deuxième instruction.

Si vous déplacez le point décimal d’une place vers la 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 

Il y a en effet une grande différence que vous devez garder à l’esprit. setScale définit vraiment l’échelle de votre numéro, alors que round arrondit votre nombre aux chiffres spécifiés, MAIS il “part 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