BigDecimal setEscala e rodada

140

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);
do utilizador
fonte
6
além de respostas aceitas abaixo - setScale () cria um novo objeto de BigDecimal - dada a sua uma classe imutável
prash
9
@prash o roundmétodo também retorna uma nova instância do BigDecimal porque, como você disse, as instâncias são imutáveis.
Daiscog

Respostas:

212

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:

// 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
dale peters
fonte
38
Re: "" precisão "é o número total de dígitos em um número." Não. Precisão é o número de dígitos significativos. A precisão de 0.000042M é 2.
David J.
2
Consulte: "precisão": a contagem de dígitos começa no dígito diferente de zero à esquerda do resultado exato. docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Eddy
se "Precisão é o número de dígitos significativos", por que a precisão de 0,0000009 vem como 2? deve ser 1
Sanchi Girotra 24/10
1
Como está sendo definido o valor do seu BigDecimal? Como você está produzindo o valor (usando um String.format () pode ocultar dígitos significativos)?
Dale Peters
1
@SchichiGirotra A precisão é "o número de dígitos no valor não escalado". Uma precisão de 2 com um valor não dimensionado de 90 e uma escala de 8 fornece 0,0000009. Assim como uma precisão de 1, valor não escalonado de 9 e escala de 7. #
daiscog
52

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

user817756
fonte