Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Entendendo o comportamento da função resto() no Oracle


As próprias pessoas que escreveram a documentação (que parecem não se lembrar de algumas definições da aritmética) parecem inseguras sobre o que escreveram. Por um lado, no início da explicação, eles mencionam ROUND - ainda mais tarde, quando eles dão uma definição mais formal, eles dizem

"Inteiro mais próximo" não é formalmente definido em aritmética e, de fato, é permitido usar esse nome para round(x), exceto quando a parte fracionária de x for exatamente 0,5, caso em que "inteiro mais próximo" é ambíguo e pode-se optar por use "arredondar para baixo" como sua própria definição de "inteiro mais próximo".

Não fique muito chateado com essas inconsistências na documentação, se puder. Você verá muitos mais.

No entanto :O que é MUITO pior é que o comportamento é inconsistente. Eu uso Oracle 12.1, e na minha máquina acabei de tentar e recebo
remainder(10, 4) =  2
remainder( 6, 4) = -2

Sem rima ou razão. Muito melhor fazer sua própria divisão, usando FLOOR e afins.

Editar - Ou talvez haja algum motivo; talvez eles usem uma definição de "inteiro mais próximo" para significar, no caso de empate, o par mais próximo inteiro. Ainda produzindo resultados inesperados, é melhor não usar a função REMAIDER() do Oracle.