Pergunta

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);
Foi útil?

Solução

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 da vírgula 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, porém a precisão nunca é especificada na segunda instrução.

Se você mover a vírgula uma casa para a direita, a diferença ficará clara:

// 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

Outras dicas

De fato, há uma grande diferença, que você deve ter em mente. O SetScale realmente definiu a escala do seu número, enquanto a rodada arredonda seu número para os dígitos especificados, mas "começa com o dígito mais à esquerda do resultado exato", conforme mencionado no JDK. Portanto, em 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top