Campo Float Firebird
boa tarde,
Estou com problemas com campo Float no Firebird 1.5. Quando tento gravar o número ´282236,93´ ele grava como 282236,938. Ai complica tudo, porque faço o arredondamento quando vou buscar esse valor no banco e ele passa a ficar como se fosse 282236,94 na minha aplicação. Não posso mudar esse campo para Numeric nesse projeto.
Alguem pode me ajudar a resolver esse dilema?
Estou com problemas com campo Float no Firebird 1.5. Quando tento gravar o número ´282236,93´ ele grava como 282236,938. Ai complica tudo, porque faço o arredondamento quando vou buscar esse valor no banco e ele passa a ficar como se fosse 282236,94 na minha aplicação. Não posso mudar esse campo para Numeric nesse projeto.
Alguem pode me ajudar a resolver esse dilema?
Danilodcf
Curtidas 0
Respostas
Sirologic
08/01/2008
Rapaz, a coisa complicou. Já q vc ñ pode alterar seu projeto, sujiro uma solução um pouco ortodoxa. Crie um segundo campo do tipo numéric e replique o valor desse campo, e comesse trabalhando somente com o novo campo. No futuro aconcelho a criar uma nova tabela transferindo todos os dados para ela.
abraços
Sidnei Roberto
Jampa/PB 8)
abraços
Sidnei Roberto
Jampa/PB 8)
GOSTEI 0
Danilodcf
08/01/2008
Obrigado pela dica Sidnei, mas preciso resolver isso com o próprio campo Float, será que tem alguma solução para isso?
GOSTEI 0
Onjahyr
08/01/2008
Primeiro, ao criar sua tabela, creio que esteja colocando no último parâmetro ´,10,0´ o certo seria ´,10,2´. Já no caso das três casas no programa com Float, use FormatFloat e você resolverá a questão pois o [b:382afb2a1b]FormatFloat[/b:382afb2a1b] formata segundo como você desejar... Veja um exemplo no Help do Delphi que exlica sobre o [b:382afb2a1b]FormatFloat[/b:382afb2a1b].
GOSTEI 0
Danilodcf
08/01/2008
O problema está no campo Float no próprio Firebird. Faça um teste, crie uma tabela com um campo Float e insira o número 282236,93 (estou usando o IbExpert para fazer essa operacao) e ao comitar ele vai atribuir o valor 282236,938 no campo (na verdade ele atrubui 282236,9375).
GOSTEI 0
Onjahyr
08/01/2008
Amigo, veja bem. Qual o problema no Firebird? você vai usar ele fora do seu programa? Se não vai, então para que todo esse alarme :lol:
Veja bem, o que vc tem que se preocupar é no seu programa!
No seu programa, use a propriedade Display Format e informar nela:
[b:33e0474f87]#,0.00[/b:33e0474f87]
Então, sempre que o componente for pegar os dados no seu banco, só vai trazer com duas casas decimais apenas, o restante será ignorado, entendeu? Já no Firebird, se tiver 200 casas decimais, do que importa? Importaria se você fosse trabalhar com finanças como posto de gasolina que quer saber o valor real do combustível que seria (um exemplo) de R$ 1,3408 ou se você utilizar o Firebird como no Access, mas no seu caso você vai usar dentro da sua aplicação.
Blz?
Veja bem, o que vc tem que se preocupar é no seu programa!
No seu programa, use a propriedade Display Format e informar nela:
[b:33e0474f87]#,0.00[/b:33e0474f87]
Então, sempre que o componente for pegar os dados no seu banco, só vai trazer com duas casas decimais apenas, o restante será ignorado, entendeu? Já no Firebird, se tiver 200 casas decimais, do que importa? Importaria se você fosse trabalhar com finanças como posto de gasolina que quer saber o valor real do combustível que seria (um exemplo) de R$ 1,3408 ou se você utilizar o Firebird como no Access, mas no seu caso você vai usar dentro da sua aplicação.
Blz?
GOSTEI 0
Onjahyr
08/01/2008
Amigo, veja bem. Qual o problema no Firebird? você vai usar ele fora do seu programa? Se não vai, então para que todo esse alarme :lol:
Veja bem, o que vc tem que se preocupar é no seu programa!
No seu programa, use a propriedade Display Format e informar nela:
[b:36387a8d80]#,0.00[/b:36387a8d80]
Então, sempre que o componente for pegar os dados no seu banco, só vai trazer com duas casas decimais apenas, o restante será ignorado, entendeu? Já no Firebird, se tiver 200 casas decimais, do que importa? Importaria se você fosse trabalhar com finanças como posto de gasolina que quer saber o valor real do combustível que seria (um exemplo) de R$ 1,3408 ou se você utilizar o Firebird como no Access, mas no seu caso você vai usar dentro da sua aplicação.
Blz?
Andei pesquisando na internet e encontrei essa função: Vê se funciona aí, mas avisa se funcionou ou não:
Use
FloatToStrF(Numero, Formato, precisão, decimais)
onde:
Numero: O numero que deseja converter
Formato: Formato a ser usado. Use ffNumber (para outros formatos, leia o help da
funcao)
precisão: A precisão decimal que deve ser levado em consideração. Eu uso
normalmente 15
decimais: número de casas decimais que desejo converter. Aqui vc pode
especificar 3, 4, 5, ou quantas for necessário.
Para maiores informações, leia o help da função FloatToStrF
GOSTEI 0
Danilodcf
08/01/2008
Amigo, acho que voce não entendeu o problema.
Imagine uma situação: Voce tem uma tabela de lancamentos Financeiro, voce faz um derteminado lancamento com o valor de 282236,93, ate ai tranquilo. voce vai trazer esse registro para sua aplicacao e ele te traz 282236,94, sua aplicação já está errada, Ok?
Já tentei usar FormatFloat(´,0.00´, Field), ja formatei de direto no ClientDataSet e nao deu certo. O Firebird sempre grava os valores Float com valores aproximados, tipo 358,30 = 358,2999999, e sempre traz o valor correto para aplicacao (358,30). Essa tabela ja tem mais de 80.000 registros e somente apresenta esse erro quando gravo esse valor especifico 282236,93. Tente criar uma tabela com o campo float e coloque esse valor e puxe pelo delhi que voce vai entender qual é o meu problema.
Imagine uma situação: Voce tem uma tabela de lancamentos Financeiro, voce faz um derteminado lancamento com o valor de 282236,93, ate ai tranquilo. voce vai trazer esse registro para sua aplicacao e ele te traz 282236,94, sua aplicação já está errada, Ok?
Já tentei usar FormatFloat(´,0.00´, Field), ja formatei de direto no ClientDataSet e nao deu certo. O Firebird sempre grava os valores Float com valores aproximados, tipo 358,30 = 358,2999999, e sempre traz o valor correto para aplicacao (358,30). Essa tabela ja tem mais de 80.000 registros e somente apresenta esse erro quando gravo esse valor especifico 282236,93. Tente criar uma tabela com o campo float e coloque esse valor e puxe pelo delhi que voce vai entender qual é o meu problema.
GOSTEI 0
Danilodcf
08/01/2008
alem disso se eu tentar fazer Select somando os valores dessa tabela, a soma vai vim com 0,01 a mais por conta desse problema.
GOSTEI 0
Onjahyr
08/01/2008
Pesquisando na internet (no site DBFreeMagazine), eu encontrei isso aqui numa pergunta igualzinha a sua:
----------------------------------------------------------------
Para gravar com duas casas decimais voce pode mudar o tipo do campo de ´float´ para ´numeric´ ex: ´numeric(15,2)´ este tipo define q quantidade de casas decimais.
mas se deseja somente visualizar com duas casas decimais, utilize na hora do select a funcao ´cast´ do firebird.
ex:
select cast(campofloat as numeric(15,2))
from tabela
espero ter ajudado...
----------------------------------------------------------------
Também espero ter te ajudado!
Blz.
----------------------------------------------------------------
Para gravar com duas casas decimais voce pode mudar o tipo do campo de ´float´ para ´numeric´ ex: ´numeric(15,2)´ este tipo define q quantidade de casas decimais.
mas se deseja somente visualizar com duas casas decimais, utilize na hora do select a funcao ´cast´ do firebird.
ex:
select cast(campofloat as numeric(15,2))
from tabela
espero ter ajudado...
----------------------------------------------------------------
Também espero ter te ajudado!
Blz.
GOSTEI 0