Pourquoi Oracle n'utilise pas Bankers rule (la méthode d'arrondi)?Oracle Bankers rule
Répondre
L'arithmétique décimale précise est un sujet vaste et complexe.
Google 'mike colishaw décimal arrondi' si vous voulez lire le ahem Oracle sur le sujet.
Fondamentalement, il existe de nombreux systèmes d'arrondissement qui sont possibles: -
everthing Arrondir - la valeur par défaut dans la plupart des langues, y compris C comme Oracle est écrit en C est sans doute pourquoi ce qu'ils font. Arrondir tout - rarement vu mais doit parfois être mis en œuvre en raison de règles de marché et fiscales obscures.
Demi-arrondi de base - tout ce qui est supérieur à .5 arrondit tout le reste. Demi-arrondi généreux - tout ce qui est inférieur à .5 arrondit tout le reste. Bankers Rounding - Les nombres pairs suivent la règle de demi-arrondi de base, les nombres impairs la règle Generous Half Rounding. Ceci est rarement vu dans les banques réelles qui préfèrent arrondir à la hausse si les fonds viennent leur chemin et arrondissent vers le bas quand il va le client. ORACLE NUMBER est en fait une très bonne implémentation de l'Arithmétique décimale et est exacte aussi loin que possible.
+1 pour Oracle jeu de mots! –
Vous pouvez toujours implémenter votre propre fonction d'arrondi banquier comme décrit here.
Arrondi du banquier de 0,5 à 0: arrondit vers le nombre pair.
Oups, j'ai mis dans "l'explication" de l'arrondi 0.5 à 1. L'OP ne l'a pas mentionné. Fixé maintenant – Thilo
Oracle a mis en place un demi-tour loin de zéro:
SQL> select round(22.5) from dual
2/
ROUND(22.5)
-----------
23
SQL> select round(23.5) from dual
2/
ROUND(23.5)
-----------
24
SQL> select round(-23.5) from dual
2/
ROUND(-23.5)
------------
-24
SQL> select round(-22.5) from dual
2/
ROUND(-22.5)
------------
-23
SQL>
Pourquoi ne pas changer à des banquiers Arrondi? Eh bien, pour la plupart des buts demi-tour de zéro est assez bon. De plus, il y a cette ancienne solution de rechange, changer cela risquerait de casser trop la base de code existante - celle d'Oracle aussi bien que celle de tous ses clients.
Ancien thread, mais quelqu'un peut toujours avoir besoin de cela. Les flottants binaires d'Oracle et les doubles binaires suivent la règle d'arrondi du banquier en arrondissant à un nombre entier. Donc, vous pouvez l'utiliser. C'est moche mais cela fonctionne:
given : price = 2.445 SQL> select round(to_binary_float(price * 100))/100 as price_rounded from dual; price_rounded ------------- 2.44 given : price = 2.435 SQL> select round(to_binary_float(price * 100))/100 as price_rounded from dual; price_rounded ------------- 2.44
La multiplication et la division par 100 sont nécessaires dans cet exemple. Je n'ai pas été en mesure de comprendre les détails du comportement, mais sélectionnez round (to_binary_float (price), 2) pour certains décimal, prix, ne semble pas toujours arrondi à la hausse ou à la baisse par les mêmes règles. J'ai trouvé, cependant, que l'arrondi à un nombre entier me donne toujours ce dont j'ai besoin.
Je suppose que vous voulez vraiment dire: - Pourquoi l'arithmétique décimale utilisant le type de données NUMBER dans une base de données ORAACLE n'utilise pas le schéma de demi-arrondi appelé arrondi des banquiers. –
Parce qu'Oracle a plus d'argent que la plupart des banquiers, et ne voit aucune raison de suivre leur conseil? – skaffman
en prenant un conseil bancaire ... semble dangereux! – lexu