Precisão com casas decimais, como conseguir?

Delphi

29/11/2005

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á.


Titanius

Titanius

Curtidas 0

Respostas

Sabado

Sabado

29/11/2005

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


GOSTEI 0
Massuda

Massuda

29/11/2005

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.


GOSTEI 0
Titanius

Titanius

29/11/2005

é, 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


GOSTEI 0
Macario

Macario

29/11/2005

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)


GOSTEI 0
Massuda

Massuda

29/11/2005

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.


GOSTEI 0
Titanius

Titanius

29/11/2005

valeu pessoal...


GOSTEI 0
POSTAR