Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rodrigo Yoshida

[Resolvido] Problemas com SELECT e float

Recommended Posts

Opa, estou com um problema básico em MySQL, mas não consigo entendê-lo. Vou tentar explicar: Possuo uma tabela de frete, onde busco nela o valor do frete para um determinado CEP e peso, portanto utilizo um SELECT da seguinte maneira:

 

 

SELECT * FROM frete

WHERE cmp_faixainicial <= 12230000

AND cmp_faixafinal >= 12230000

AND cmp_pesoinicial <= 0.1

AND cmp_pesofinal >= 0.1

 

 

Na tabela de frete possuo o seguinte registro

cmp_faixainicial: 12230000

cmp_faixafinal: 12230999

cmp_pesoinicial: 0.1

cmp_pesofinal: 3

 

 

Na teoria, era para este SELECT buscar este registro na tabela, porém ele não busca, retorna 0 linhas. Percebi que o erro poderia estar no cmp_pesoinicial, pois se colocar 0.1 nesse campo no SELECT eu recebo esta linha, porém se parar pra pensar, eu coloquei a regra "AND cmp_pesoinicial <= 0.1", ou seja, se for MENOR ou IGUAL, sendo que os dois são iguais, então deveria retornar.

 

Alguém aí tem alguma idéia do que seja? Pode ser algo bobo, mas depois de umas 12 horas programando tudo fica mais difícil...

Compartilhar este post


Link para o post
Compartilhar em outros sites

a unica coisa >= 0.1 e <=0.1 ao mesmo tempo eh o proprio 0.1, e 0.1 eh diferente de 3, logo a linha nao irá aparecer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) O que ocorre assim ?

 

SELECT * FROM frete
WHERE 12230000 between cmp_faixainicial AND cmp_faixafinal 
AND 0.1 between cmp_pesoinicial AND cmp_pesofinal 

2) cmp_faixainicial e cmp_faixafinal tem que tipo ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

a unica coisa >= 0.1 e <=0.1 ao mesmo tempo eh o proprio 0.1, e 0.1 eh diferente de 3, logo a linha nao irá aparecer.

 

 

Acho que você não analisou bem a query, então vamos lá:

 

 

AND cmp_pesoinicial <= 0.1

O campo peso inicial precisa ser menor ou igual a 0.1, vamos observar o campo float na tabela:

 

cmp_pesoinicial: 0.1

Ele é igual a 0.1, então deveria ser verdadeiro

 

 

AND cmp_pesofinal >= 0.1

O campo peso final tem que ser maior ou igual a 0.1, então vamos observar o campo:

 

cmp_pesofinal: 3

Ele é maior que 0.1, portanto deveria ser verdadeiro

 

 

 

Acredito que você tenha entendido que eu estava comparando o 0.1 com o mesmo campo na tabela, mas são dois campos diferentes, básicamente ele tem que ver se o 0.1 é maior do que o peso inicial e menor do que o final para ver se está dentro da faixa de peso do registro.

 

1) O que ocorre assim ?

 

SELECT * FROM frete
WHERE 12230000 between cmp_faixainicial AND cmp_faixafinal 
AND 0.1 between cmp_pesoinicial AND cmp_pesofinal 

2) cmp_faixainicial e cmp_faixafinal tem que tipo ?

 

 

Então, não retornou nada! Estranho, eu dei um select básico assim:

SELECT * FROM frete WHERE cmp_faixainicial = 0.1

 

e retornou 0 linhas! Mas quando eu faço a consulta:

SELECT * FROM frete WHERE cmp_faixainicial > 0.1

 

Ele retorna a linha que eu quero! Mas no campo cmp_faixa inicial eu tenho o valor 0.1, agora me pergunto, campos float tem alguma propriedade diferente no MySQL?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Problema resolvido! Consultando a documentação do MySQL eles informam que isso acontece pois valores float não são precisos, na verdade o que é exibido 0.1 pode na verdade armazenar 0.1000001 e ele "arredondar", por isso o SELECT com o > funcionava. Ali dizia para utilizar o tipo DECIMAL com tamanho 10.2 que funcionaria, e realmente funcionou.

 

O que eu achei estranho é que não vi nenhuma informação do assunto em Português, quando resolvi buscar informação em Inglês achei com uma certa rapidez até, estranho...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.