DevMedia

Como trabalhar com 2 casas decimais no Delphi?

0
Olá, existe alguma maneira que eu possa trabalhar com apenas 2 casas em se tratando de Currency?



Desde já agradeço.


Publicidade

Respostas (12)

0

Citação:
Olá, existe alguma maneira que eu possa trabalhar com apenas 2 casas em se tratando de Currency?



Desde já agradeço.


titanius, não entendi direito sua dúvida, desculpe.
Qual o problema?
Visualmente?
Alguma operação matemática errada?

O que ocorre exatamente?

flw


0
Olá adriano, não expliquei direito, sorry! :oops:

Bem, o meu problema é o seguinte, crio uma variavel do tipo Currency

var
VlrParcela: Currency;

VlrParcela := 200 / 3;

Ou seja, se voce for ver, ele vai ficar com quatro casas decimais, e nao duas como é o normal... e se você somar as parcelas, nao dará o valor total no final, sempre da uma diferenca de alguns centavos... entendeu?

É que no delphi currency é sempre em 4 casas... eu queria que eu tivesse como falar pra ele tratar currency com 2 casas decimais no sistema inteiro, ao inves de eu ficar transformando

vlrparcela := strtofloat(formatfloat(´#0.00´, VlrParcela));


entende? se eu ficar transformando funciona, mas se eu esquecer uma unica vez, o calculo sai errado.. :(


Espero que tenha entendido...

[]s


0
use a função
#Código
Result := FormatFloat(´#,,0.00´,Valor);

espero ter ajudado :wink:


0
Olá paullsoftware

Eu já uso esta função, e funciona, o problema é que se eu esquecer lá se foi.... o que eu quero é algum jeito de colocar como padrão no meu sistema que Currency é 2 casas decimais e não 4 como o padrão do delphi...



[]s


0
Declarando
#Código
function  CurrToStrF(Value: Currency; Format: TFloatFormat = ffNumber; Digits: Integer = 2): String;


Função
#Código
function CurrToStrF(Value: Currency; Format: TFloatFormat = ffNumber; Digits: Integer = 2): String;
var
  Buffer: array[0..63] of Char;
begin
  SetString(Result, Buffer, FloatToText(Buffer, Value, fvCurrency,  Format, 0, Digits));
end;


Você poderia usar a função com o nome de CurrToStr, eu uso como CurrToStrF somente para ficar bem claro para quem vai utilizar que o número virá sepado por pontos e virgula.


0
Olá amigos, obrigado pelos códigos...

mas...

não é isso.. vou tentar explicar novamente... por padrão, qualquer variável do tipo Currency em delphi, tem 4 casas decimais. Eu queria um jeito de mudar esse padrão no meu sistema, e por padrão ser 2 casas decimais... não usar nenhuma funcao pra isso, pois função cabe margem pra erro, se alguem esquecer de usa-la...


[]s


0
Veja bem titanius você precisa que seja 2 casas somente para mostrar para o usuário em edits, a função que eu postei tem o mesmo nome da funcao do delphi CurrToStrF então você nunca vai esquecer de usar pois é a forma usada para transformar numeros em strings.


0
titanius se vc alterar o valor da variável CurrencyDecimals (definica na SysUtils) para 4. Será que resolve?


0
Weber, a questão não é exibir para o usuário... e sim nas questões de cálculos internos no sistema...

micheus eu tentei

CurrencyDecimals := 2;

E não funcionou... será que usei errado?

[]s a todos...


0
titanius, estive olhando melhor sobre CurrencyDecimals e aparentemente deveria ser útil apenas para casos de formatação (imagino que deveria ser quando da conversão para string - CurrToStr(valor) ), mas testando, nem para isso serviu. :(


Citação:
vlrparcela := strtofloat(formatfloat(´#0.00´, VlrParcela));
se tiver que utilizar este procedimento, talvez seja mais interessante utilizar as que lidam com o currency:#Código
vlrparcela := StrToCurr(FormatCurr(´0.00´, VlrParcela));



0

Citação:
Weber, a questão não é exibir para o usuário... e sim nas questões de cálculos internos no sistema...


estive sempre acompanhando este tópico , ao longo deste calorosa discussão e sinceramente reprovo (no bom sentido é claro) esta idéia de tentar diminuir a precissão ....

voltemos ao inicio.......


Citação:
var
VlrParcela: Currency;

VlrParcela := 200 / 3;


Ou seja, se voce for ver, ele vai ficar com quatro casas decimais, e nao duas como é o normal... e se você somar as parcelas, nao dará o valor total no final, sempre da uma diferenca de alguns centavos... entendeu?


suponha que voce diminua esta precisão ...
A Pergunta que não quer lalar e a seguinte : :?: :?: :?: :?: :?:

Quando se faz
VlrParcela := 200 / 3;

:arrow: com precisão de duas casas decimais o que voce espera obter amigo titanius :?: :?: :?: :?:


Citação:
VlrParcela:=66,65 uma opção
VlrParcela:=66,66 uma opção
VlrParcela:=66,67 uma opção


Qualquer que seja a opçaõ ´escolhida´ , no final dara sempre a diferençã de alguns centavos... e nessse caso voce so piora esta diferença na proporção INVERSA da PRECISÃO escolhida


Citação:
Qaunto Menor a PRECISÃO :arrow: Maior Sera a DIFERENÇA dos ´Centavos´


Minha conclusão:
Eu não vejo nenhum tipo de ganho numa possivel diminuição da precisão. Em sistema que usa prestações do tipo ´carnes´ , cabe ao programador fechar com alguma artimetica o valor final.. seja truncando seja calculando etc.., para que estes arrendodamentos que não vem da programação , mas sim da propria matemática , não interfira no mundo Limitado de duas casas Decimais em que o Homem Trabalha...

imagine se alem da moeda de um centavo ainda tivessemos que carregar no bolso as moedas de decimo de centavos , centesimo de centavos , milionessimos de centavos etc....


0
Concordo com o Marco Salles.
Esse comentário é apenas para tentar elucidar a questão do nº de casas retornado. A possível explicação para o fato de obter, como retorno da operação, sempre quatro casas decimais deve ser devido a como o Currency é processado:
Currencyis a fixed-point data type that minimizes rounding errors in monetary calculations. It is stored as a scaled 64-bit integer with the four least significant digits implicitly representing decimal places. When mixed with other real types in assignments and expressions, Currency values are automatically divided or multiplied by 10000. (help Delphi, tópico Real types, último parágrafo)

[]s