Problema com BigDecimal

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…

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

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:

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

[quote=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…

[/quote]
tente usar o tipo de arredondamento ROUND_UP, assim:

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

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:

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.

é que eu uso a jdk 1.4.2 :smiley:

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

Brigadão a todos … :thumbup:

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.

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

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

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));

Fabrício Cozer Martins, Obrigado!

O tipo de arredondamento BigDecimal.ROUND_UP funcionou na hora!

Valeuuu

Há também o enum RoundingMode

Nele há uma tabela exemplificando os arredondamentos.