Veneno
Abril 18, 2007, 2:18pm
#1
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
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);
Veneno
Abril 18, 2007, 3:18pm
#6
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 …
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.
Veneno
Abril 18, 2007, 4:49pm
#9
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.
gleise
Fevereiro 22, 2008, 4:47pm
#11
tente usar o tipo de arredondamento ROUND_UP, assim:
BigDecimal divisor = new BigDecimal(3);
BigDecimal cauculado = sub.divide(divisor, BigDecimal.ROUND_UP);
Puxa, valeu Fabrício! Estava com o mesmo problema e funcionou certinho!
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.