BigDecimal [Resolvido]

6 respostas
L

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.

6 Respostas

G

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

L

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.

G

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

L

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.

G

:thumbup:

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

B

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.

Criado 28 de agosto de 2010
Ultima resposta 30 de ago. de 2010
Respostas 6
Participantes 3