Fórum Erro ao comparar dois TDateTime #300951
27/10/2005
0
var v_data_almoco_ini, v_hora_almoco_fim, v_data_almoco_fim, v_hora_almoco_ini, v_diferenca_almoco :TDateTime;
begin
if (v_client_jornada.fieldbyname(´C_TEMPO_ALMOCO´).AsDateTime <> null) or ((v_hora_almoco_ini <> null) and (v_hora_almoco_fim <> null)) then
begin
v_diferenca_almoco := ((v_data_almoco_ini + v_hora_almoco_fim) -
(v_data_almoco_fim + v_hora_almoco_ini));
end;
Até aqui só armazeno os dados nas variáveis..
O Erro :
if v_diferenca_almoco = v_client_jornada.fieldbyname(´C_TEMPO_ALMOCO´).AsDateTime then
begin
v_du := v_du +
v_client_jornada.fieldbyname(´C_CARGA_HORARIA´).AsDateTime;
end;
Quando estou debugando :
v_diferenca_almoco := 0,004312
v_client_jornada.fieldbyname(´C_TEMPO_ALMOCO´).AsDateTime := 0,004312
exatamente iguais..
mas o Delphi retorna false nesta comparação..
Alguém sabe o Pq??
Uso Delphi 7 .CLX, e Firebird 1.5 Final
Agradeço a atenção de todos
Cabelo
Curtir tópico
+ 0Posts
27/10/2005
Rômulo Barros
Gostei + 0
27/10/2005
Massuda
Geralmente não se testa a igualdade de valores em ponto flutuante mas sim se a diferença entre eles é pequena, por exemplo...
if Abs(v_diferenca_almoco - v_client_jornada.fieldbyname(´C_TEMPO_ALMOCO´).AsDateTime) < 1E-6 then
Gostei + 0
27/10/2005
Cabelo
if Abs(v_diferenca_almoco - v_client_jornada.fieldbyname(´C_TEMPO_ALMOCO´).AsDateTime) < 1E-6 then
Massuda você poderia por favor explicar melhor o que é isso?
Deu certo a comparação, mas gostaria de entender o pq?
Gostei + 0
27/10/2005
Massuda
3 * 1 / 3 = 1
mas...
3 * 0,333333 = 0,999999 <> 1
Assim, ao invés de testar se dois números em ponto flutuante são iguais, teste se a diferença entre eles é pequena.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)