Como verificar se um número é multiplo de um número x

28/12/2015

4

Pessoal eu estou desenvolvendo uma rotina para verificar se um número é multiplo do outro no delphi 7, porem estou enfrentado o seguinte problema, em
alguns casos a função "frac" não funciona perfeitamente como no caso abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var
fresto,x,f_qtde_emb :double;
begin
edit1.text:='6,09';
edit2.text:='2,03';

f_qtde_emb := StrToFloat(Edit2.Text);

x:= ((strtofloat((Edit1.Text))) / ((f_qtde_emb))) ;
fresto:= frac(x);//frac função nativa do delphi

if fresto <> 0 then //no caso de diferente de zero o número em questão não será multiplo
begin
Messagedlg('A quantidade deve ser multipla de '+ floattostr(f_qtde_emb) + #13+'Favor corrigir e tentar novamente',mtWarning,[mbok],0);
Edit1.SetFocus;
abort;
end;


end;

end.

a variavel "fresto" é alimentada pelo função "frac" com o valor "4,44089209850063e-16"
alguem tem alguma ideia o por quê disso?
Responder

Posts

FaabiianooC obrigado pela atenção, mas isso não me ajuda, pois só funciona com inteiros
e os valores que posso receber podem ser reais
Responder
Alguém, sabe algum jeito?
Responder
Achei uma solução que até o momento funcionou,
1- eu passei o código pra o delphi xe7 e o erro persistia, então tive uma ideia de trocar a plataforma para 64 bits
e o erro sumiu troquei novamente para o win 32 bits e o erro persistiu então percebi que não poderia usar a função "frac",
uma vez que o erro persiste na compilação 32 bits do win
então alterei meu código pra esse usando o "mod":

procedure TForm1.Button1Click(Sender: TObject);
var
fresto :double;
x,i_qtde_emb,i_qtde_ven:integer;
begin
edit1.text:='6,09';
edit2.text:='2,03';
/////////////////////Nesse trecho eu tiro as casas decimais pra e transformo o numero em um inteiro para usar o mod/////////////////////////////
i_qtde_ven:=StrToInt(floattostr(strtofloat(EDIT1.Text)*1000));
i_qtde_emb :=StrToInt(floattostr(StrToFloat(edit2.Text)*1000));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if i_qtde_emb=0 then i_qtde_emb := 1;

x:= (i_qtde_ven) mod (i_qtde_emb) ;
fresto:= (x);

if fresto <> 0 then
begin
Messagedlg('A quantidade deve ser multipla de '+ floattostr(i_qtde_emb/1000) + #13+'Favor corrigir e tentar novamente',mtWarning,[mbok],0);
EDIT1.Text := '0';
EDIT1.SetFocus;
abort;
end;


end;

end.
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira