sql >> Base de Datos >  >> RDS >> Oracle

Comprender el comportamiento de la función de resto () en Oracle

Las personas que escribieron la documentación (que parecen no recordar algunas definiciones de la aritmética) parecen no estar seguras de lo que escribieron. Por un lado, al principio de la explicación mencionan ROUND - pero más tarde, cuando dan una definición más formal, dicen

El "entero más cercano" no está definido formalmente en aritmética y, de hecho, se permite usar ese nombre para la ronda (x), excepto cuando la parte fraccionaria de x es exactamente 0,5, en cuyo caso el "entero más cercano" es ambiguo y uno puede optar por usan "redondear hacia abajo" como su propia definición de "entero más cercano".

No se moleste demasiado con tales inconsistencias en la documentación, si puede. Verás muchas más.

Sin embargo :Lo que es MUCHO peor es que el comportamiento es inconsistente. Uso Oracle 12.1, y en mi máquina acabo de probar y obtengo

remainder(10, 4) =  2
remainder( 6, 4) = -2

Sin rima ni razón. Es mucho mejor hacer tu propia división, usando FLOOR y demás.

Editar - O tal vez haya alguna razón; tal vez usan una definición de "entero más cercano" para significar, en el caso de un empate, el par más cercano entero. Aún produciendo resultados inesperados, es mejor no usar la función REMAINDER() de Oracle.