Problema com BigDecimal

14 respostas
Veneno

Olá …
meu problema eh o seguinte…

Ex:
tenho o número 40.00 quero dividi-lo por 3
onde sub = 40.00

BigDecimal divisor = new BigDecimal(3);
                    BigDecimal cauculado = sub.divide(divisor);

o resultado seria uma dízima 13,3333333333333

mas da esse erro

Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException:
 Non-terminating decimal expansion; no exact representable decimal 
result.

gostari de saber como posso resolver isso…
eu queria mostra somente 2 casas dpois do ponto…

vlw abraço…

14 Respostas

dm_thiago

Eu resolveria isso da seguinte forma:

Não usaria BigDecimal, usaria int mesmo. E quando fosse imprimir, era só você usar a classe DecimalFormat.

Acho que assim resolveria o seu problema, e até de uma forma mais correta, pois o int ficaria com todos os números possives, sendo mais correto caso você queira realizar mais alguma conta, e na hora de imprimir sairia exatamente como você quer.

[]´s

erickcellani

eu usaria um float…

pois assim… vc pode fazer o seu calculo e usar o NumberFormat setando a quantidade máxima e mínima de casas decimais :wink:

dm_thiago

Opa! Isso mesmo. float, não int. Mas ainda continuaria usando DecimalFormtat =P

Fabricio_Cozer_Marti

Veneno:
Olá …
meu problema eh o seguinte…

Ex:
tenho o número 40.00 quero dividi-lo por 3
onde sub = 40.00

BigDecimal divisor = new BigDecimal(3);
                    BigDecimal cauculado = sub.divide(divisor);

o resultado seria uma dízima 13,3333333333333

mas da esse erro

Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException:
 Non-terminating decimal expansion; no exact representable decimal 
result.

gostari de saber como posso resolver isso…
eu queria mostra somente 2 casas dpois do ponto…

vlw abraço…


tente usar o tipo de arredondamento ROUND_UP, assim:

BigDecimal divisor = new BigDecimal(3);
  BigDecimal cauculado = sub.divide(divisor, BigDecimal.ROUND_UP);
Veneno

ae vlw galera …
fiz das duas formas
Com float e com BigDecimal

float cauculado = sub/3;
                    DecimalFormat decimalFormat = new DecimalFormat(); 
                    decimalFormat.setMaximumFractionDigits(2); 
                    
                   System.out.println(decimalFormat.format(cauculado));
BigDecimal divisor = new BigDecimal(3);
                     BigDecimal cauculado = sub.divide(divisor,  BigDecimal.ROUND_UP);

                   System.out.println(cauculado);

os 2 deram certo …
o BigDecimal arredondou pra 13,34 e o float mostrou norma 13,33
nao sei qual eh melhor…
ouvi falar que BigDecimal eh melhor pra trabalhar com valores monetarios…

vlw … :smiley:

Fabricio_Cozer_Marti

existem outros tipos de arredondamento, olha na API do BigDecimal.
E sem dúvida alguma, pra não te dar dor de cabeça no futuro, use BigDecimal quando estiver trabalhando com valores decimais, principalmente envolvendo valores monetários.

erickcellani

é que eu uso a jdk 1.4.2 :smiley:

Veneno

ble…vou dar uma olhada …
e vou usar BigDecimal rs …

Brigadão a todos … :thumbup:

Luiz_Aguiar

Sim, pq não perde a precisão nos cálculos, se vc precisa disso, como num sistema monetário mesmo, onde não se pode perder 1 centavos de precisão, o BigDecimal seria a opção.

gleise

Puxa, valeu Fabrício! Estava com o mesmo problema e funcionou certinho! :smiley:

juliocesarsrosa

Ola galera estou com o mesmo problema mas nao consigo aplicar essa solução ao meu codigo
esse é o meu codigo como eu poderia aplica essa solução nele?

txValorJurosDia.setText(nf.format((BigDecimalUtil.getBigDecimal(txValorTitulo.getText()).multiply(BigDecimalUtil.getBigDecimal(txJurosMes.getText())).divide(new BigDecimal(100))).divide(new BigDecimal(30))).substring(3));

Obrigado

juliocesarsrosa

Ja consegui obrigado

txValorJurosDia.setText(nf.format((BigDecimalUtil.getBigDecimal(txValorTitulo.getText()).multiply(BigDecimalUtil.getBigDecimal(txJurosMes.getText())).divide(new BigDecimal(100) , BigDecimal.ROUND_UP)).divide(new BigDecimal(30) , BigDecimal.ROUND_UP)).substring(3));
fmarinzeck

Fabrício Cozer Martins, Obrigado!

O tipo de arredondamento BigDecimal.ROUND_UP funcionou na hora!

Valeuuu

WellingtonRamos

Há também o enum RoundingMode

Nele há uma tabela exemplificando os arredondamentos.

Criado 18 de abril de 2007
Ultima resposta 3 de fev. de 2011
Respostas 14
Participantes 9