Subtração de variável Double
Talvez eu esteja ficando louco mas não consegui subtrair valores com decimais.
Se eu colocar valores inteiros funciona bem, com valores decimais nunca chego a SALDO = 0. Tente com saldo a 333,33 e desconte valores de 111,11.
Se eu colocar valores inteiros funciona bem, com valores decimais nunca chego a SALDO = 0. Tente com saldo a 333,33 e desconte valores de 111,11.
var Form1: TForm1; SALDO: Double; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin SALDO := StrToFloat( Edit1.Text ); end; procedure TForm1.Button2Click(Sender: TObject); Var Valor: double; begin Valor := StrToFloat( Edit2.Text ); Saldo := Saldo - Valor; Memo1.Lines.Add(FormatFloat(´0.00´, valor) ); Edit1.Text := FormatFloat(´0.00´, Saldo); if SALDO = 0 then ShowMessage(´Saldo Zerado´); end;
Okama
Curtidas 0
Respostas
Aroldo Zanela
21/09/2004
Colega,
Sim é um problema de armazenamento da mantissa. Use tipos currencys para evitar o problema.
Faça o exemplo abaixo e depois troque Currency por qualquer tipo Real, como Double:
Sim é um problema de armazenamento da mantissa. Use tipos currencys para evitar o problema.
Faça o exemplo abaixo e depois troque Currency por qualquer tipo Real, como Double:
var saldo: Currency; begin saldo := 333.33; saldo := saldo - 111.11; ShowMessage(FloatToStr(saldo)); saldo := saldo - 111.11; ShowMessage(FloatToStr(saldo)); saldo := saldo - 111.11; ShowMessage(FloatToStr(saldo)); end;
GOSTEI 0
Marcelo Saviski
21/09/2004
Na Unit math existem algumas funções p/ auxiliar na comparação de nº de ponto flutuante, considerando um ´desvio´ na precisão.
CompareValue
SameValue
por exemplo:
ou no seu caso, usando a funçaõ IsZero
o último valor [color=blue:4a6a438920]Epsilon[/color:4a6a438920] informa a precisão, nos casos acima 1 centésimo, ´valores com frações menores que 1 centésimo onde o restante do valor fosse igual seriam consideradas iguais de acordo com a precisão mínima 0,01.´
CompareValue
SameValue
por exemplo:
if SameValue(3.0401, 3.04, 0.01) then "parecidos"
ou no seu caso, usando a funçaõ IsZero
if IsZero(SALDo, 0,01) then ...
o último valor [color=blue:4a6a438920]Epsilon[/color:4a6a438920] informa a precisão, nos casos acima 1 centésimo, ´valores com frações menores que 1 centésimo onde o restante do valor fosse igual seriam consideradas iguais de acordo com a precisão mínima 0,01.´
GOSTEI 0
Okama
21/09/2004
Agradeço as respostas.
Trocando o tipo double para Currency resolveu o problema.
Valeu! :wink:
Trocando o tipo double para Currency resolveu o problema.
Valeu! :wink:
GOSTEI 0