Precisão com casas decimais, como conseguir?
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á.
Obrigado, desde já.
Titanius
Curtidas 0
Respostas
Sabado
29/11/2005
Prezado:
Não sei como vc estaria calculando seus valores. Pode utilizar formatfloat que funciona.
Não sei como vc estaria calculando seus valores. Pode utilizar formatfloat que funciona.
GOSTEI 0
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.
Com relação aos valores que você exibe, use FormatFloat (como o sabado sugeriu) ou FloatToStrF.
GOSTEI 0
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
[]s
GOSTEI 0
Macario
29/11/2005
Ola Programador.
Eu uso dessa forma
Espero que ajude. 8)
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
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.
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
29/11/2005
valeu pessoal...
GOSTEI 0