Divisao com bigdecimal

2 respostas
R

Srs tenho o codigo abaixo :

BigDecimal valorAParcelar = new BigDecimal(53.00);
Integer qtdeParcelas = 3;

valorEntrada = valorAParcelar.divide(new BigDecimal(qtdeParcelas)

Quando eu executo a divisão acima ocorre o erro abaixo.

Exception in thread “main” java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1462)

Alguem sabe o que pode ser ?

2 Respostas

V

53/3 = 17 + 2/3. Não há representação exata por causa da dízima periódica.

Existem versões sobrecarregadas do método divide que permitem você especificar uma forma de arredondamento para casos como estes.

Use esse método:

public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode);
S

rogeriosantos77:
Srs tenho o codigo abaixo :

BigDecimal valorAParcelar = new BigDecimal(53.00);
Integer qtdeParcelas = 3;

valorEntrada = valorAParcelar.divide(new BigDecimal(qtdeParcelas)

Quando eu executo a divisão acima ocorre o erro abaixo.

Exception in thread “main” java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1462)

Alguem sabe o que pode ser ?

BigDecimal preza pela exatidão. Quando a operação que vc faz não é exata ele se queixa.
Divide() com um parametro significa que a divisão é resto zero. Quando não é, ele dá aquele erro.
È possivel, como foi dito, driblar isso. Mas isso não deve ser feito em geral, apenas quando necessário.
No seu caso particular não deve ser feito. Vc deve usar

BigDecimal preco;
BigDecimal parcelas;

BigeDecimal[] result = preco.divideAndRemainder(parcelas);

BigeDecimal valorPrimeiraParcela = result[0].add(result[1]);
BigeDecimal valorDemaisParcelas = result[0];

Caso contrário vc vai perder centavos na divisão das parcelas

Criado 3 de julho de 2008
Ultima resposta 3 de jul. de 2008
Respostas 2
Participantes 3