BigDecimal [Resolvido]

Oi pessoal,

Estou tendo um problema estranho com BigDecimal.

Eu leio o dado do banco de dados (postgresql) onde está armazenado numa coluna como “real”. (uso hibernate)

Eu mostro o dado sem nenhum cálculo ou tratamento na minha view.

Normalmente o valor aparece de forma correta, porém as vezes o valor vem diferente:

Por exemplo:

para 5.111 -> 5.1110001
para 1.111 -> 1.110999
para 0.99 -> 0.99000001
para 0.8 -> 0.80000001
para 0.7 -> 0.69999999
para 0.3 -> 0.30000001
para 0.2 -> 0.2 (vem certo)
para 0.15 -> 0.15000001
para 0.1 -> 0.1 (vem certo)

Uso o VRaptor, por isso coloquei nesse forum. Se for necessário posto em outro.

Obrigado.

Na verdade sua dúvida é de pgsql X money, e isso deveria ser tratado em outro subfórum mesmo. Mas vamos lá…

Como você está construindo seu BigDecimal? O correto é construir ele a partir de uma String, pois se você usar o contrutor com double/float você perde a precisão. Eu tenho usado BigDecimal com pgsql e tudo funciona bem, para qualquer valor.

Esse erro acontece ao ler do banco ou quando vocẽ persiste? Você está usando os converters localizados do Vraptor?

Abraços

Garcia,

Esse erro acontece quando leio do banco de dados. Mesmo antes de mostrar na view já estão distorcidos.

No meu projeto, estou testando a aplicação e inserindo esses dados apresentados, diretamente no banco, via pgAdmin.

Estou sim usando os converters do VRaptor

Construo quando necessário a partir de uma String. Lí sobre isso no Blog da Caelum. Não tenho tido problema com cálculos.

Passe todas as informações possíveis, principalmente como estão mapeados o campo na entidade, a definição do banco… etc.

Garcia,

Resolvido!

Alterei diretamente, via pgAdmin, o campo do pgsql de real para numeric(10,2) e aparentemente o problema sumiu.

Pelo que me lembre o campo tinha sido criado, pelo hibernate, quando ainda trabalhava com Float.

Obrigado, só de ter de explicar o problema faz refletir melhor.

:thumbup:

Eu ainda não conhecia esse real, mesmo usando pgsql há algum tempo :oops:

Explicando o problema:

Os tipos real e double precision do PostgreSQL são tipos numéricos de ponto flutuante, implementação da IEEE 754. Esse formato não foi feito para exatidão dos dados.

O que você estava atrás são tipos numéricos de precisão arbitrária ou infinita, que é o tipo numeric, que você já achou.