Como trabalhar com 2 casas decimais no Delphi?
27/06/2006
0
Desde já agradeço.
Titanius
Posts
27/06/2006
Adriano Santos
[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
27/06/2006
Titanius
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
27/06/2006
Paullsoftware
Result := FormatFloat(´#,,0.00´,Valor);
espero ter ajudado :wink:
27/06/2006
Titanius
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
27/06/2006
Weber
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] 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.
28/06/2006
Titanius
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
28/06/2006
Weber
29/06/2006
Micheus
29/06/2006
Titanius
[b:7a4a9a1a03]micheus[/b:7a4a9a1a03] eu tentei
CurrencyDecimals := 2;
E não funcionou... será que usei errado?
[]s a todos...
30/06/2006
Micheus
vlrparcela := StrToCurr(FormatCurr(´0.00´, VlrParcela));
01/07/2006
Marco Salles
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.......
[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 :?: :?: :?: :?:
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
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....
03/07/2006
Micheus
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
Clique aqui para fazer login e interagir na Comunidade :)