Como trabalhar com 2 casas decimais no Delphi?
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.
Desde já agradeço.
Titanius
Curtidas 0
Respostas
Adriano Santos
27/06/2006
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
GOSTEI 0
Titanius
27/06/2006
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
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
GOSTEI 0
Paullsoftware
27/06/2006
use a função
espero ter ajudado :wink:
Result := FormatFloat(´#,,0.00´,Valor);
espero ter ajudado :wink:
GOSTEI 0
Titanius
27/06/2006
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
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
GOSTEI 0
Weber
27/06/2006
Declarando
Função
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.
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.
GOSTEI 0
Titanius
27/06/2006
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
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
GOSTEI 0
Weber
27/06/2006
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.
GOSTEI 0
Micheus
27/06/2006
[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?
GOSTEI 0
Titanius
27/06/2006
[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...
[b:7a4a9a1a03]micheus[/b:7a4a9a1a03] eu tentei
CurrencyDecimals := 2;
E não funcionou... será que usei errado?
[]s a todos...
GOSTEI 0
Micheus
27/06/2006
[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));
GOSTEI 0
Marco Salles
27/06/2006
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....
GOSTEI 0
Micheus
27/06/2006
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
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
GOSTEI 0
Alessandro Assis
27/06/2006
Isso mesmo muito obrigado!!!!
GOSTEI 0