Precisão com casas decimais, como conseguir?

29/11/2005

2

Olá, gostaria de saber como faço para meu sistema trabalhar com 2 casas decimais, sempre...pois estou fazendo calculos de imposto, e os numeros vem com um monte de casas decimais, e isso está interferindo no calculo total, gostaria de saber como fazer isso, pois não gostaria de ficar formatando toda hora o numero, pois se eu esquecer de algum, atrapalha o sistema inteiro.

Obrigado, desde já.


Responder

Posts

29/11/2005

Sabado

Prezado:
Não sei como vc estaria calculando seus valores. Pode utilizar formatfloat que funciona.


Responder

29/11/2005

Massuda

Internamente, valores Double costumam ter 15 dígitos significativos enquanto valores Currency usam 4 casas decimais.

Com relação aos valores que você exibe, use FormatFloat (como o sabado sugeriu) ou FloatToStrF.


Responder

30/11/2005

Titanius

é, mais o meu maior problema é justamente nas conta e não em exibir... gostaria de haver algum método que sempre trabalhe com 2 casas decimais, pois toda hora que for trabalhar ter que formatar o numero é foda, imagina se esquece de algum? Realmente, não tem jeito de forçar o Delphi a trabalhar com 2 casas decimais ?


[]s


Responder

30/11/2005

Macario

Ola Programador.

Eu uso dessa forma

Código: 
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; 



Espero que ajude. 8)


Responder

30/11/2005

Massuda

Se estiver lidando com valores monetários, melhor trabalhar usando Currency ao invés de Double (ou similar).

Valores Double não tem representação exata no computador, de modo que pode ser que você obtenha um valor 0,800000000123 ao invés de 0,80 mesmo fazendo algum tratamento especial nesse valor.

Valores Currency não tem esse problema, pois tem representação exata no computador, embora usem 4 casas decimais sempre (logo, o valor 0,00001 não pode ser armazenado em um currency).

Quanto a ter que formatar o valor, que eu me lembre, sempre foi assim.


Responder

30/11/2005

Titanius

valeu pessoal...


Responder