Erro ao comparar dois TDateTime
Colegas tenho a seguinte situação
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
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
Curtidas 0
Respostas
Rômulo Barros
27/10/2005
Esses cálculos não poder ser executados através de um SELECT ?
GOSTEI 0
Massuda
27/10/2005
Quando estou debugando :
...
exatamente iguais.. mas o Delphi retorna false nesta comparação..
São números em ponto flutuante... pode ter diferença entre os valores (tipo 1E-7), embora a representação textual dos valores mostre o mesmo número.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
Cabelo
27/10/2005
São números em ponto flutuante... pode ter diferença entre os valores (tipo 1E-7), embora a representação textual dos valores mostre o mesmo número.
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
Massuda você poderia por favor explicar melhor o que é isso?
Deu certo a comparação, mas gostaria de entender o pq?
GOSTEI 0
Massuda
27/10/2005
poderia por favor explicar melhor o que é isso?
Números em ponto flutuante não conseguem armazenar corretamente todos os valores possíveis. Mesmo nós, ao fazer cálculos ´no papel´, temos o mesmo problema. Por exemplo, podemos escrever 1/3 como sendo 0,33 ou 0,3333 ou 0,333334, mas nenhum desses valores será exatamente 1/3. Por isso, 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