Fórum Erro ao comparar dois TDateTime #300951

27/10/2005

0

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


Cabelo

Cabelo

Responder

Posts

27/10/2005

Rômulo Barros

Esses cálculos não poder ser executados através de um SELECT ?


Responder

Gostei + 0

27/10/2005

Massuda

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 



Responder

Gostei + 0

27/10/2005

Cabelo

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?


Responder

Gostei + 0

27/10/2005

Massuda

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar