Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comprendre le comportement de la fonction rest() dans Oracle

Les personnes qui ont écrit la documentation (qui semblent ne pas se souvenir de certaines définitions de l'arithmétique) elles-mêmes semblent incertaines de ce qu'elles ont écrit. D'une part, au début de l'explication, ils mentionnent ROUND - encore plus tard, quand ils donnent une définition plus formelle, ils disent

"L'entier le plus proche" n'est pas formellement défini en arithmétique, et en effet on est autorisé à utiliser ce nom pour round(x) sauf lorsque la partie fractionnaire de x est exactement 0,5, auquel cas "l'entier le plus proche" est ambigu et on peut choisir de utiliser "arrondir vers le bas" comme leur propre définition de "l'entier le plus proche".

Ne soyez pas trop contrarié par de telles incohérences dans la documentation, si vous le pouvez. Vous en verrez bien d'autres.

Cependant :Ce qui est BEAUCOUP pire, c'est que le comportement est incohérent. J'utilise Oracle 12.1, et sur ma machine je viens d'essayer et j'obtiens

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

Sans rime ni raison. Il vaut mieux faire votre propre division, en utilisant FLOOR et autres.

Modifier - Ou peut-être qu'il y a une raison; peut-être utilisent-ils une définition de "l'entier le plus proche" pour signifier, dans le cas d'une égalité, le pair le plus proche entier. Produisant toujours des résultats inattendus, mieux vaut ne pas utiliser la fonction REMAINDER() d'Oracle.