BigDecimal setScale [ RESOLVIDO ]

Olá pessoal,

preciso ter apenas duas casas decimais depois do ponto usando um BigDecimal…

Teoricamente seria só fazer isso :

respostaQuest.getValor().setScale(2, BigDecimal.ROUND_DOWN)

ou então :

[b]NumberFormat formatter = new DecimalFormat("#0.00");

String tempTest = formatter.format(respostaQuest.getValor());
new BigDecimal(tempTest)
[/b]

A questão é, não funfa … Não consigo ter o resultado que quero por exemplo pegar

um BigDecimal 33.333333333333 e transaformar num BigDecimal 33.33 …

Alguém consegue me ajudar ? Grato !

Olá networking.rafael,

De uma lida neste artigo:

http://blog.caelum.com.br/arredondamento-no-java-do-double-ao-bigdecimal/

Quase!
Acontece que objetos BigDecimal são imutáveis. Quer dizer, o método setScale não altera o número e sim retorna um novo. Tem que “re-atribuir” o número retornado para a variável desejada:

BigDecimal valorArredondado = respostaQuest.getValor().setScale(2, BigDecimal.ROUND_DOWN);
respostaQuest.setValor(valorArredondado);

BigDecimal num = new BigDecimal(33.333333333333); DecimalFormat df = new DecimalFormat("#,##0.00"); String teste = df.format(num); System.out.println(teste);

OU

BigDecimal num = new BigDecimal(33.333333333333); BigDecimal teste = num.setScale(2,BigDecimal.ROUND_DOWN); System.out.println(teste);

testa ae mano…

falow

Olá gomesrod,

entendi o que você disse, o problema é realmente esse o resultado não muda,

tentei sua solução aqui e ainda não foi …

Tentei até isso no desespero rs :

[code]BigDecimal valorArredondado = respostaQuest.getValor().setScale(2, BigDecimal.ROUND_DOWN);

						respostaQuest.setValor(null); 
						
						respostaQuest.setValor(valorArredondado);  [/code]

Tá complicado, tem outra ideia ?

cara testa o de cima??

vc testou o DecimalFormat??

lembrando que o metodo format retorna uma String

[]s,

Bom dia marcelo.silva.java,

Eu tive que mudar o formato passado como parametro para me atender, por algum motivo não passa dessa linha quando tento fazer assim …

DecimalFormat df = new DecimalFormat("#0.00");  

Caríssimos colegas,

tive uma evolução, com base no código abaixo :

[code]BigDecimal resultadoTemp = new BigDecimal(entry.getValue().intValue() * 100 / totalQuestionarios);

BigDecimal resultadoFinal = resultadoTemp.setScale(2, BigDecimal.ROUND_UP);
[/code]

O resultado esperado era 33.33 … Resumindo é pq eu dividi 100 por 3 …

No caso meu resultado agora esta vindo 33.00

Alguma ideia dq possa ser ?

entry.getValue().intValue() * 1 / totalQuestionarios

Os tipos são int, int e int, não? O resultado é um int.

Suponha que entry.getValue() = 100 e totalQuestionarios = 3.

Então 1 * 100 / 3 = 33, não 33.333333

Para a conta que você quer fazer funcionar corretamente, use algo como:

new BigDecimal (entry.getValue()).multiply (new BigDecimal ("100")).divide (totalQuestionarios, 2, RoundingMode.HALF_EVEN);

OBRIGADÃO entanglement !!! Era isso mesmo !!!

Nossa, queria agradecer a todos pelo empenho e me ajudar, foi a primeira vez postei uma pergunta em forum,

salvaram meu emprego ! kkkkkkk

Segue como ficou :

BigDecimal resultadoTemp = new BigDecimal (entry.getValue()).multiply(new BigDecimal("100")).divide(totalQuestionarios, 2, RoundingMode.HALF_EVEN);  
								
BigDecimal resultadoFinal = resultadoTemp.setScale(2);

MUITO OBRIGADO MESMO !!!

Só lembrando que o “2” que eu botei no “divide” com 3 parâmetros serve para deixar a escala com 2, não necessitando usar o tal do “setScale (2)” :slight_smile: