ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Firebird (double precision) x Delphi AsFloat [Resolvido]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
stammer
Novato
Novato


Registrado: Quinta-Feira, 1 de Novembro de 2007
Mensagens: 52

MensagemEnviada: Seg Mai 10, 2010 8:06 am    Assunto: Firebird (double precision) x Delphi AsFloat [Resolvido] Responder com Citação

Estou com um problema.

Tenho campos double precision numa base de dados firebird.
Estou tentando inserir/alterar dados na tabela com esses campos, usando o componente IBSQL da paleta Interbase, passando os valores por parâmetro.
Esses campos devem ser gravados com 4 casas decimais, nem mais, nem menos (menos só sse houver zeros).

O problema é que ao passar por parâmetro o valor (usando ParamByName('CAMPO').AsFloat), o delphi gera mais de casas decimais, gerando números que eu não quero... ex 19,4567230004567356.

Como posso passar esse valor por parâmetro sem que o delphi não altere o valor (com 4 casas decimais)?

Já tentei função de arredondamento, AsCurrency(gera somente 2 casas) e nada funciona.... alguém pode me ajudar?

Obs: Não posso alterar o tipo de campo na base e o valor deve ser passado por parâmetro.


Editado pela última vez por stammer em Seg Mai 10, 2010 9:07 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
stammer
Novato
Novato


Registrado: Quinta-Feira, 1 de Novembro de 2007
Mensagens: 52

MensagemEnviada: Seg Mai 10, 2010 9:06 am    Assunto: Responder com Citação

Eu mesmo acabei encontrando uma solução para o problema fazendo algumas pesquisas.... a solução foi a seguinte:

deve declarar FMTBcd no Uses

Para passar o parâmetro sem mudar o valor passado, faça o seguinte

ParamByName('CampoDoublePrecision').AsBcd := DoubleToBcd(ValorComCasasDecimais);

Assim evita-se que seja gerado na base um número com casas decimais que você não gerou na aplicação.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Seg Mai 10, 2010 9:13 am    Assunto: Responder com Citação

O double precision é como nosso velho conhecido do delphi o tipo double, tem precisão dupla e obedece as normas do IEEE - Instituto de Engenheiros Eletricistas e Eletrônicos, utilizando o co-processador matemático para fazer os calculos em vista de acelerá-los.

No caso o melhor no firebird é utilizar o tipo Numeric(15,2) ou ajustá-lo às suas necessidades.


Mas no caso de vc nao querer fazê-lo vc pode utilizar currency que é o correto para operaçoes financeiras, digo AsCurrency.




bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB