Buscar

Evitando erro de comparação com calculo no if ou no repeat until

Código

 Eu escrevi um programa e deparei com um erro sem nenhuma lógica como no exemplo abaixo:

  - Coloque no Form um componente Edit com o nome de "Edit1".
  - Coloque no Form um componente Button com o nome de "Button1".

    Agora Click no botão e escreva o evento abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var
 A,B,C: Double;
begin
 A:= 63.6;
 B:= 1;
 C:= 64.6;

 if C = (A + B) then
  Edit1.Text:= '63.6 + 1 = 64.6. O Delphi entendeu que SIM, a comparação.'
 else
  Edit1.Text:= '63.6 + 1 = 64.6. O Delphi entendeu que NÃO, a comparação.';

end;

  Agora rode o programa e click no botão. No edit aparecerá a seguinte mensagem:

                '63.6 + 1 = 64.6. O Delphi entendeu que NÃO, a comparação.'

  A pergunta é: Como que 63.6 + 1 não é igual a 64.6?

  Para esse problema eu burlei o "Delphi ou Pascal" e criei uma função muito simples, na verdade, a mais simples que já escrevi e que me deu o resultado esperado.

function TForm1.Calc_Double_If(Numero: Double): Double;
begin
 Calc_Double_If:= Numero;
end;


  Vamos arrumar o nosso programa e fazer o teste.

  - Declare a função "Calc_Double_If"
...
type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
       function Calc_Double_If(Numero: Double): Double;
  end;
....

  - Escreva a função "Calc_Double_If"
...
implementation

{$R *.dfm}

function TForm1.Calc_Double_If(Numero: Double): Double;
begin
 Calc_Double_If:= Numero;
end;
....

  - Altere o evento OnClick do Button1 como abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var
 A,B,C: Double;
begin
 A:= 63.6;
 B:= 1;
 C:= 64.6;

 if C = Calc_Double_If(A + B) then
  Edit1.Text:= '63.6 + 1 = 64.6. O Delphi entendeu que SIM, a comparação.'
 else
  Edit1.Text:= '63.6 + 1 = 64.6. O Delphi entendeu que NÃO, a comparação.';

end;



  Agora rode o programa e click no botão. Adivinha o resultado no edit?

        '63.6 + 1 = 64.6. O Delphi entendeu que SIM, a comparação.'  


  Para não correr risco, nos programas que você tiver qualquer calculo em um "IF" ou em um "Repeat Until", use essa função nos calculos de (Float/Double), em caso de Inteiros use a função abaixo:

function TForm1.Calc_Integer_If(Numero: Integer): Integer;
begin
 Calc_Integer_If:= Numero;
end;


   Valeu pessoal, e boas tecladas....

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Object pascal
Adicionada dia: 02/07/07
Por: Dárcio Nuno De Carvalho
Visualizada: 10842 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009