[firebase-br] Problemas com arredondamento.,

Sandro Souza escovadordebits em gmail.com
Qui Abr 2 18:07:15 -03 2009


Bom dia/tarde João.

Acredito que o primeiro parâmetro da udf "UDF_TRUNCDEC" seja do tipo DOUBLE
PRECISION, ou seja, quando você passa um valor para o primeiro parâmetro ele
já é convertido para o tipo DOUBLE PRECISION o que significa que ele agora é
apenas uma aproximação do valor real (1 pode virar 0.99999999999).

Eu testei as seguintes expressões no Firebird 2.1:

SELECT CAST((2.9 * 3) AS NUMERIC(10,2))FROM RDB$DATABASE;

Retornou 8.70

SELECT CAST((69 * 0.12) AS NUMERIC(10,2))FROM RDB$DATABASE;

Retornou 8.28

O tipo DOUBLE PRECISION do Firebird/Interbase é o equivalente ao tipo Double
do Delphi, ou seja, apenas uma aproximação do valor.
Se seu banco foi criado no dialeto 3, então os campos do tipo DECIMAL e
NUMERIC são armazenados internamente como inteiros para manter o máximo de
precisão, e as operações com as casas decimais são feitas implicitamente
pelo próprio banco.

Se o primeiro parâmetro da udf UDF_TRUNCDEC realmente é do tipo DOUBLE
PRECISION, então isso poderia explicar o porque da imprecisão numérica.

Pode ser apenas coincidência, mas funcionou apenas com esse typecast p/
NUMERIC.

Espero ter ajudado mais que atrapalhado.

2009/4/2 Forrest® <fernando.bg em gmail.com>

> Joao Marcos wrote:
>
> > O campo para quantidade é Numeric(10,3)  e o Valor unitario é
> > Numeric(10,2)
>
> João muito estranho isso, pois já tive problemas com campos decimal,
> mas numeric não tive. Um palpite é que o problema está no retorno da
> udf, verifique o tipo de retorno dessa udf e também o tipo das
> variáveis internas da udf.
>
> T++++++++++
> --
>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista