[firebase-br] Fwd: Problema com Double

eduardo eduardo em icontroller.com.br
Seg Maio 30 10:19:49 -03 2005


Bom dia Marlon

> a função "AsCurrency" utiliza uma váriavel do tipo "double", o valor vem 
> incorreto.
AsCurrency retorna Currency que não é ponto flutuante e sim fixo;
O problema pode estar em como o campo está definido no Delphi. 
Normalmente, Numeric(18,1) seria tratado no Delphi como TFMTBCD que 
também é fixo e não flutuante. Se estiver como TFloatField, então pode 
ser que na conversão para Currency (AsCurrency) a bagunça já esteja 
feita, a menos que você também defina a propriedade Currency como True.

> Sem dúvida é muito estranho o que está ocorrendo e por enquanto não 
> encontrei nenhuma alternativa.
O que está acontecendo não é exatamente estranho. Este é o comportamento 
normal de float (ponto flutuante). Neste tipo, não sei bem porque, o 
prcessador tenta atribuir o valor mais próximo dentro da significância 
de dígitos. Desta forma, para o processador, 4 e 3,9999999999999 é a 
mesma coisa. Os tipos fixos, são tratados como integer e dividos por 
multiplos de 10 conforme a quantidade de dígitos.

Se você consultar o help do Delphi sobre Real Types, verá que single, 
double, extended são floats, diferindo, basicamente no limite máximo.
Sendo que

"Extended offers greater precision than other real types but is less 
portable. Be careful using Extended if you are creating data files to 
share across platforms."
	
"Currency is 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."

No caso do CPF, talvez fosse melhor vc repensar os custos benefícios de 
armazenar como numeric. O post do Daniel aconselhando um tipo string me 
parece mais adeqüado.

[]s Eduardo





Mais detalhes sobre a lista de discussão lista