Valores decimais iguais, quando comparado se são iguais o delphi entendi como diferente
Senhores,
estou com um problema Chato pra resolver..
eu tenho um valor de titulo somado com juros Ex.: valor recebibo (T=24.00 + J=2.00) = 26.00 e tenho um valor fixo a receber de 26.00
a minha condição para efetivar o recebimento é que.
valor recebido >= valor a receber.. ate aqui tudo bem.. porém quando vou efetivar o recebimento o delphi acusa que o valor é diferente e so entra na condição recebimento := N.
Ex. codigo:
if valrecebido >= valreceber then
begin
recebimento := S
end
else recebimento := N;
como faço p resolver isso?
desde já agradeço a quem poder me ajudar...
estou com um problema Chato pra resolver..
eu tenho um valor de titulo somado com juros Ex.: valor recebibo (T=24.00 + J=2.00) = 26.00 e tenho um valor fixo a receber de 26.00
a minha condição para efetivar o recebimento é que.
valor recebido >= valor a receber.. ate aqui tudo bem.. porém quando vou efetivar o recebimento o delphi acusa que o valor é diferente e so entra na condição recebimento := N.
Ex. codigo:
if valrecebido >= valreceber then
begin
recebimento := S
end
else recebimento := N;
como faço p resolver isso?
desde já agradeço a quem poder me ajudar...
Jesus Lima
Curtidas 0
Respostas
Marco Salles
06/06/2012
Como esta declarado essas Variáveis ????
Qual o tipo ???
Qual o tipo ???
GOSTEI 0
Joel Rodrigues
06/06/2012
Amigo, esse tipo de coisa acontece às vezes. Pode acontecer de um valor ser 26.00000000001 e o outro 26.00, logo, diferentes. Você pode usar arredondamentos (existem funções pra isso) para usar apenas duas casas decimais, por exemplo, além de sempre utilizar o mesmo tipo de dados.
GOSTEI 0
Marcos Roberto
06/06/2012
Função para arredondamento
RoundTo(Avalue,Adigit);
- arredondar números com casas decimais. Também utiliza o arredondamento do banqueiro.
Parâmetros:
Avalue: Valor a ser arredondado.
Adigit: Na prática é a quantidade de dígitos que se deseja arredondar Avalue. Por exemplo, se você deseja arredondar um valor que possui três casas decimais para um novo valor com duas casas decimais, então informe nesse parâmetro o valor -2.
Adigit aceita valores entre -37 a 37(inclusive).
Exemplos:
RoundTo (1.234, -2); //retorna 1.23
RoundTo (1.235, -2); //retorna 1.24
RoundTo (1.245, -2); //retorna 1.24
valeu!
RoundTo(Avalue,Adigit);
- arredondar números com casas decimais. Também utiliza o arredondamento do banqueiro.
Parâmetros:
Avalue: Valor a ser arredondado.
Adigit: Na prática é a quantidade de dígitos que se deseja arredondar Avalue. Por exemplo, se você deseja arredondar um valor que possui três casas decimais para um novo valor com duas casas decimais, então informe nesse parâmetro o valor -2.
Adigit aceita valores entre -37 a 37(inclusive).
Exemplos:
RoundTo (1.234, -2); //retorna 1.23
RoundTo (1.235, -2); //retorna 1.24
RoundTo (1.245, -2); //retorna 1.24
valeu!
GOSTEI 0
Marco Salles
06/06/2012
Bem as vezes so alterando o tipo de declaração das variáveis resolve
Mas como nossos amigos ja adiantaram em algumas funções para esta finalidade , gosto muito
da função SameValue da Unidade Math
veja a sua assinatura
function SameValue(const A, B: Extended; Epsilon: Extended): Boolean;
begin
if Epsilon = 0 then
Epsilon := Max(Min(Abs(A), Abs(B)) * ExtendedResolution, ExtendedResolution);
if A > B then
Result := (A - B) <= Epsilon
else
Result := (B - A) <= Epsilon;
end;
Mas como nossos amigos ja adiantaram em algumas funções para esta finalidade , gosto muito
da função SameValue da Unidade Math
veja a sua assinatura
function SameValue(const A, B: Extended; Epsilon: Extended): Boolean;
begin
if Epsilon = 0 then
Epsilon := Max(Min(Abs(A), Abs(B)) * ExtendedResolution, ExtendedResolution);
if A > B then
Result := (A - B) <= Epsilon
else
Result := (B - A) <= Epsilon;
end;
GOSTEI 0
Pablo Vargas
06/06/2012
Ja tive esse problema também, e nem com funções de arredondamento consegui resolver, tive que apelar para uma solução de contorno
tipo
1º: multiplica tuas variáveis por 100
2º: faça um Trunc, tirando o que ficar de casas decimais
3º: divida por 100
4º: compare suas variáveis
confesso não ser uma solução elegante, mas te garanto que funciona.
tipo
1º: multiplica tuas variáveis por 100
2º: faça um Trunc, tirando o que ficar de casas decimais
3º: divida por 100
4º: compare suas variáveis
confesso não ser uma solução elegante, mas te garanto que funciona.
GOSTEI 0
Jesus Lima
06/06/2012
Amigos muito obrigado pelas respostas... realmente todas as soluções funcionaram... e o problema realmente era casas decimais porem o estranho é que o delphi não mostrava o erro...
mesmo assim obrigado pela ajuda de todos...
mesmo assim obrigado pela ajuda de todos...
GOSTEI 0