Como trabalhar com 2 casas decimais no Delphi?

27/06/2006

Olá, existe alguma maneira que eu possa trabalhar com [b:c1bee7dcbf]apenas 2 casas[/b:c1bee7dcbf] em se tratando de Currency?



Desde já agradeço.


Titanius

Respostas

27/06/2006

Adriano Santos

Olá, existe alguma maneira que eu possa trabalhar com [b:7cc3bf08ff]apenas 2 casas[/b:7cc3bf08ff] em se tratando de Currency? Desde já agradeço.


[b:7cc3bf08ff]titanius[/b:7cc3bf08ff], não entendi direito sua dúvida, desculpe.
Qual o problema?
Visualmente?
Alguma operação matemática errada?

O que ocorre exatamente?

flw


Responder Citar

27/06/2006

Titanius

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


Responder Citar

27/06/2006

Paullsoftware

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

espero ter ajudado :wink:


Responder Citar

27/06/2006

Titanius

Olá [b:9a60379280]paullsoftware[/b:9a60379280]

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


Responder Citar

27/06/2006

Weber

Declarando
function  CurrToStrF(Value: Currency; Format: TFloatFormat = ffNumber; Digits: Integer = 2): String;


Função
function CurrToStrF(Value: Currency; Format: TFloatFormat = ffNumber; Digits: Integer = 2): String;
var
  Buffer: array[0..63&93; 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.


Responder Citar

28/06/2006

Titanius

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


Responder Citar

28/06/2006

Weber

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.


Responder Citar

29/06/2006

Micheus

[b:814b2ea470]titanius[/b:814b2ea470] se vc alterar o valor da variável [i:814b2ea470]CurrencyDecimals[/i:814b2ea470] (definica na SysUtils) para 4. Será que resolve?


Responder Citar

29/06/2006

Titanius

[b:7a4a9a1a03]Weber[/b:7a4a9a1a03], a questão não é exibir para o usuário... e sim nas questões de cálculos internos no sistema...

[b:7a4a9a1a03]micheus[/b:7a4a9a1a03] eu tentei

CurrencyDecimals := 2;

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

[]s a todos...


Responder Citar

30/06/2006

Micheus

[b:4c7868cd3c]titanius[/b:4c7868cd3c], 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. :(

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



Responder Citar

01/07/2006

Marco Salles

Weber, a questão não é exibir para o usuário... e sim nas questões de [b:1f59c396ff]cálculos internos no sistema[/b:1f59c396ff]...


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

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[b:1f59c396ff] diferenca de alguns centavos[/b:1f59c396ff]... entendeu?


[b:1f59c396ff]suponha[/b:1f59c396ff] que voce diminua esta precisão ...
A Pergunta que não quer lalar e a seguinte : :?: :?: :?: :?: :?:

Quando se faz
[b:1f59c396ff]VlrParcela := 200 / 3;[/b:1f59c396ff]

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

VlrParcela:=66,65 uma opção [b:1f59c396ff]VlrParcela:=66,66 uma opção[/b:1f59c396ff] 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 [b:1f59c396ff]piora[/b:1f59c396ff] esta diferença na proporção INVERSA da PRECISÃO escolhida

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


Minha conclusão:
Eu não vejo nenhum tipo de [b:1f59c396ff]ganho[/b:1f59c396ff] 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....


Responder Citar

03/07/2006

Micheus

Concordo com o [b:b2605e97d2]Marco Salles[/b:b2605e97d2].
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:
[i:b2605e97d2][color=blue:b2605e97d2]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.[/color:b2605e97d2][/i:b2605e97d2] [color=darkblue:b2605e97d2](help Delphi, tópico [b:b2605e97d2]Real types[/b:b2605e97d2], último parágrafo)[/color:b2605e97d2]

[]s


Responder Citar