[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