Qual é a diferença entre essas duas chamadas? (Existe algum?)
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
java
bigdecimal
do utilizador
fonte
fonte
round
método também retorna uma nova instância do BigDecimal porque, como você disse, as instâncias são imutáveis.Respostas:
Um ponto importante que é mencionado, mas não abordado diretamente, é a diferença entre "precisão" e "escala" e como eles são usados nas duas declarações. "precisão" é o número total de dígitos significativos em um número. "escala" é o número de dígitos à direita do ponto decimal.
O construtor MathContext aceita apenas precisão e RoundingMode como argumentos e, portanto, a escala nunca é especificada na primeira instrução.
setScale()
obviamente aceita escala como argumento, assim como RoundingMode, no entanto, a precisão nunca é especificada na segunda instrução.Se você mover o ponto decimal uma casa para a direita, a diferença ficará clara:
fonte
De fato, há uma grande diferença, que você deve ter em mente. O setScale realmente define a escala do seu número, enquanto a rodada arredonda o número para os dígitos especificados, mas "começa no dígito mais à esquerda do resultado exato", conforme mencionado no jdk. Portanto, com relação à sua amostra, os resultados são os mesmos, mas tente 0,0034. Aqui está minha nota sobre isso no meu blog:
http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html
fonte