BigDecimal setScale [ RESOLVIDO ]

10 respostas
networking.rafael

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 !

10 Respostas

cido18

Olá networking.rafael,

De uma lida neste artigo:

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

gomesrod

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);
marcelo.silva.java

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

networking.rafael

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 :

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

Tá complicado, tem outra ideia ?

marcelo.silva.java

cara testa o de cima??

vc testou o DecimalFormat??

lembrando que o metodo format retorna uma String

[]s,

networking.rafael

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");
networking.rafael

Caríssimos colegas,

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

BigDecimal resultadoTemp = new BigDecimal(entry.getValue().intValue() * 100 / totalQuestionarios); 
								
BigDecimal resultadoFinal = resultadoTemp.setScale(2, BigDecimal.ROUND_UP);

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 ?

E
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);
networking.rafael

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

E

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:

Criado 8 de abril de 2013
Ultima resposta 9 de abr. de 2013
Respostas 10
Participantes 5