[Resolvido] Campo FLOAT não suporta valor na casa de milhões? ERRO

10 respostas
franzzita

Bom tarde Pessoal,

Tive um problema ao armazenar o valor 1.116.849,55 em um campo Float de uma tabela no meu banco de dados.
O valor foi armazenado nesse formato: 1.11685e+006

Alguém sabe porque isso aconteceu?

Obrigada.
^^

10 Respostas

Ataxexe

Poste pra gente como você fez para armazenar esse valor. Pode ser que tenha algo errado ali.

giovanni_dalfre

Da uma olhada nesse site, tem uma tabela que fala sobre as variáveis.

http://www.dm.ufscar.br/~waldeck/curso/java/part22.html

Tente utilizar double no lugar de float, pois double pode receber um numero maior que o float. Provavelmente você esta atribuindo um valor pro float que ele não suporta.

flws!

Ataxexe

giovanni_dalfre:
Da uma olhada nesse site, tem uma tabela que fala sobre as variáveis.

http://www.dm.ufscar.br/~waldeck/curso/java/part22.html

Tente utilizar double no lugar de float, pois double pode receber um numero maior que o float. Provavelmente você esta atribuindo um valor pro float que ele não suporta.

flws!

O valor que ela quer o float até suporta, mas tem uma perda de precisão nele. Utilizar double quase sempre é melhor mesmo.

Um exemplo é esse trecho simples:

Isso imprime 1116849.5, que é perto do valor que foi armazenado no banco. Mas eu suspeito que o arredondamento pra 1116850 não tenha sido do float, por isso pedi que ela postasse o código da inserção.

ViniGodoy

Suporta, mas não com precisão. Float está sempre sujeito a arredondamentos.
Em geral, é má idéia usar float em sistemas, prefira sempre double.

Floats só são usados em nichos onde não existe necessidade de muita precisão, e o número de floats é muito grande.
Um exemplo disso é na computação gráfica, onde uma malha de um modelo 3D pode ter centenas de milhares de pontos, cada um com 4 floats para as coordenadas, 2 para as normais de luz e 10 para os materiais.

Agora, se estiver lidando com valores financeiros, trabalhe com BigDecimal.

franzzita

Senhores,

Realmente o problema aconteceu por ser um Float, modifiquei para Double e obtive o valor correto!

É uma aplicação financeira sim, não sabia que usar BigDecimal era melhor, então vou dar uma olhada pra implementar essa modificação.

Obrigada a todos pela ajuda.

Matheus_Paiva

Big decimal seria o mais preciso de todos ?

rmendes08

Matheus Paiva:
Big decimal seria o mais preciso de todos ?

Sim, por dois motivos:

  • o BigDecimal representa cada dígito decimal (e não dígitos binários)

  • o tamanho da mantissa e a posição do ponto são arbitrárias

Em compensação:

  • é um objeto, não funciona com operadores +,-, / e *.
  • verboso
  • ocupa muito mais memória
ViniGodoy

Eu também incluiria o fato de que os cálculos são bem mais lentos com BigDecimal.

Claro, se você estiver só calculando algumas médias para relatórios, isso não pode ser um problema.
Mas não sonhe jamais em usar algo assim para um sistema de engenharia, reconhecimento de padrões, ou processamento de imagens.

Gleidson_Henrique

ViniGodoy:
Eu também incluiria o fato de que os cálculos são bem mais lentos com BigDecimal.

Claro, se você estiver só calculando algumas médias para relatórios, isso não pode ser um problema.
Mas não sonhe jamais em usar algo assim para um sistema de engenharia, reconhecimento de padrões, ou processamento de imagens.

Com certeza. Fiz um sisteminha que utiliza BigDecimal nos campos. Ao receber o valor, ele converte o valor de acordo com a escala que eu colocar para ele. Porém, esta conversao a cada foco perdido, se o processador esta ocupado com algo mais, pode acontecer de dar um pequeno lag rsrs

Realmente fica mais pesado, mas se for poucos campos como no meu caso, compensa por causa da precisão.

Como o amigo rmendes08 disse, ele nao possuir os operadores + - / *, mas ele possui os métodos que lhe permite fazer isso.

Para a persistencia, campos eu estava utilizando como DECIMAL(5,3), por exemplo. De uma olhada nisso também…

Abraços

mateusviccari

cuidado tambem ao usar campos double no banco, pois os mesmos problemas que se tem com double nas linguagens de programação voce vai ter no banco.
Para valores procure dar preferencia a campos do tipo numeric(x,x)/decimal(x,x)

Criado 18 de setembro de 2012
Ultima resposta 19 de set. de 2012
Respostas 10
Participantes 8