Fórum Alguem explica isso? Seria um BUG no delphi? #274665
30/03/2005
0
Tenho um exemplo:
Coloque um botão no form e coloque esse código.
Veja o resultado. Alguém pode explicar o que acontece???
Pode-se trocar os valores....
procedure TForm1.Button1Click(Sender: TObject);
var
fvalor, fvalor1: real;
begin
fvalor1 := 20.15;
fvalor := 0;
fvalor := fvalor + 0.60;
fvalor := fvalor + 19;
fvalor := fvalor + 0.01;
fvalor := fvalor + 0.54;
if fvalor = fvalor1 then
showmessage(´é igual´);
if fvalor > fvalor1 then
showmessage(´fvalor é maior´);
if fvalor < fvalor1 then
showmessage(´fvalor é menor´);
end;
Abraços
Alexandre
_alex_
Curtir tópico
+ 0Posts
30/03/2005
Nildo
fvalor1 - fvalor
Você vai ver que tem diferença.
Pode ser que sejam as casas decimais que não são apresentadas visualmente
Gostei + 0
30/03/2005
Faelcavalcanti
Cara que loukura é essa. Estive tentando e não consegui, fiz um gambiarra e coloquei na força e deu certo! :lol: :lol: :lol:
const valordefault : Real = 20.15; var fvalor, fvalor1: Extended; begin fvalor1 := 20.15; fvalor := 0; fvalor := fvalor + 0.60; fvalor := fvalor + 19; fvalor := fvalor + 0.01; fvalor := fvalor + 0.54; if (StrToFloat(FloatToStr(fvalor)) = StrToFloat(FloatToStr(valordefault))) then showmessage(´é igual´); if fvalor > fvalor1 then showmessage(´fvalor é maior´); if fvalor < fvalor1 then showmessage(´fvalor é menor´);
Mas é lógico que não funciona, é como se fossem dois objetos distintos, de forma que não adianta verificar a condições dos dois e sim o valor literário, como referência na memória entre si.
Gostei + 0
30/03/2005
Andremuller
Fiz alguns testes:
Assim funcionou:
aumentando o valor para 20.16 e somando 0.02 ao invés de 0.01
ou colocando a expressão toda em uma linha
ou passando as variáveis de real para currency
Gostei + 0
30/03/2005
Macario
A diferença ocorre usando tipo: Real, Double ou Extended.
Usando Currency, não ocorre a diferença.
Como normalmente uso tipos Double ou Extended, comparo da seguinte forma
var fvalor, fvalor1: Extended; begin fvalor1 := 20.15; fvalor := 0; fvalor := fvalor + 0.60; fvalor := fvalor + 19; fvalor := fvalor + 0.01; fvalor := fvalor + 0.54; fvalor := Arredonda(fvalor,4); fvalor1 := Arredonda(fvalor1,4); if fvalor = fvalor1 then showmessage(´é igual´); if fvalor > fvalor1 then showmessage(´fvalor é maior´); if fvalor < fvalor1 then showmessage(´fvalor é menor´);
function Arredonda(Value: Extended; Decimals: integer): Extended; var Factor, Fraction: Extended; begin Factor := IntPower(10, Decimals); (* A conversão para string e depois para float evita erros de arredondamentos indesejáveis.*) Value := StrToFloat(FloatToStr(Value * Factor)); Result := Int(Value); Fraction := Frac(Value); if Fraction >= 0.5 then Result := Result + 1 else if Fraction <= -0.5 then Result := Result - 1; Result := Result / Factor; end;
Agora se alguem puder dizer as diferenças de como se comporta cada tipo de variavel, seria legal.
Gostei + 0
30/03/2005
Fred
Gostei + 0
30/03/2005
Faelcavalcanti
A diferença ocorre usando tipo: Real, Double ou Extended.
Usando Currency, não ocorre a diferença.
[/quote:6781411545]
Cara no help têm :
Ou seja ele está atribuído a um tipo literal de 8 bytes possuindo de 19-20 dígitos. Essa só o Mr. M sabe !!! :lol:
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)