Como verificar se um número é multiplo de um número x
28/12/2015
0
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?
Ederson Rodrigues
Posts
28/12/2015
Fabiano Carvalho
https://www.devmedia.com.br/calculando-o-quociente-e-o-resto-da-divisao/23747
28/12/2015
Ederson Rodrigues
e os valores que posso receber podem ser reais
30/12/2015
Ederson Rodrigues
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.
Clique aqui para fazer login e interagir na Comunidade :)