[firebase-br] Operador de Divisão - Qual o problema?

Elton da Motta Barbosa embarbosa em gmail.com
Ter Jan 12 10:29:27 -03 2010


>Pessoal,
>Vejam o seguinte SQL:
>select 1/2 from RDB$DATABASE
>O resultado que o Firebird me retorna é “0”, sendo que o certo era retornar
>“0.5”.
>Porque o Firebird retorna errado? O operador de divisão só pega a  parte
>inteira da divisão?
>Obrigada,

>Priscila Lugon
>Tecnologia

Olá,

Isso é um padrão SQL. O QuickStart guide do Firebird explica sobre
isso nas páginas 22 e 23 (na versão do FB 2.0).
Extraí de lá veja:

*Firebird SQL*
Every database management system has its own idiosyncrasies in the
ways it implements SQL. Firebird adheres to the SQL standard more
rigorously than most other RDBMSes. Developers migrating from products
that are less standards-compliant often wrongly suppose that Firebird
is quirky, whereas many of its apparent quirks are not quirky at all.

*Division of an integer by an integer*
Firebird accords with the SQL standard by truncating the result
(quotient) of an integer/integer calculation to the next lower
integer. This can have bizarre results unless you are aware of it.
For example, this calculation is correct in SQL:
1 / 3 = 0
If you are upgrading from an RDBMS which resolves integer/integer
division to a float quotient, you will need to alter any affected
expressions to use a float or scaled numeric type for either dividend,
divisor, or both.
For example, the calculation above could be modified thus in order to
produce a non-zero result:
1.000 / 3 = 0.333

tradução livre, quase google... =]

* Firebird SQL *
Cada sistema de gerenciamento de banco de dados tem suas próprias
idiossincrasias na maneira que implementa SQL. Firebird adere ao
padrão SQL de forma mais rigorosa do que a maioria dos outros RDBMSs.
Desenvolvedores que migram de produtos que são normas menos
complacentes, muitas vezes erroneamente supõe que o Firebird é
equivocado, ao passo que muitos de seus aparentes caprichos não são
tão equivocados assim.

* Divisão de um número inteiro por um número inteiro *
O Firebird concordemente com o padrão SQL trunca o resultado
(quociente) de um cálculo  inteiro / inteiro para o número inteiro
imediatamente inferior. Isso pode ter resultados bizarros a menos que
você esteja ciente disso.
Por exemplo, este cálculo está correto em SQL:
1 / 3 = 0
Se você estiver atualizando a partir de um RDBMS que resolve inteiro /
divisão inteira de um quociente de flutuação, você vai precisar
alterar quaisquer expressões afetadas usar um float ou escalados para
qualquer tipo numérico dividendo, divisor, ou ambos.
Por exemplo, o cálculo acima poderia ser modificada, assim, a fim de
produzir um resultado diferente de zero:
1,000 / 3 = 0,333

Como você pode imaginar, isso já deu dor de cabeça pra um bocado de gente ;)

abraços,




Mais detalhes sobre a lista de discussão lista