2010-09-10 9 views
3

Lorsque vous arrondissez à 2 décimales, la valeur 4.01132141 est arrondie à 4.02 car elle dépasse 4.01.Ceil Oracle pour les nombres décimaux

Comment pouvez-vous faire cela en PL/SQL?

+0

À quoi faut-il "0" arrondir? –

+0

0 car il ne dépasse pas 0,00 –

+0

Impossible de répéter: 'exec dbms_output.put_line (round (4.01132141, 2));' sur 10gR2 renvoie la valeur 4.01. –

Répondre

3

Une façon serait de faire ceil(value*100)/100, mais cela semble inélégant. Pas sûr qu'il y ait un moyen de faire round se comporter comme vous le souhaitez.

4

La fonction 'arrondir' est CEIL, mais génère un nombre entier.

La fonction 'arrondir' est FLOOR, mais génère également un nombre entier.

La fonction pour 'arrondir au plus près' est ROUND, et elle vous permet de spécifier un nombre de décimales (dp).

Notez que CEIL arrondit à un nombre entier; pour arrondir à 2 dp, vous auriez à multiplier par 100, utiliser PLAFOND, et diviser par 100.


Pour obtenir la réponse raisonnable directement, utilisez:

ROUND(value+0.005, 2) 

Cela fonctionne parce que, pour les données d'exemple de 4.01132141, la valeur transmise à ROUND est 4.01632 et, lorsqu'elle est arrondie à 2 dp, elle devient 4.02. Si la valeur commençait par 4.0593, disons, la valeur passée à ROUND serait 4.0643, qui, lorsqu'elle est arrondie à 2 dp, devient 4.06, comme requis.

Il y a quelques morceaux difficiles là-bas:

  1. Si le nombre de dp varie, la valeur à ajouter (0,005 dans l'exemple) varie. Vous pouvez créer une table pour contenir le nombre de décimales dans une colonne et la valeur d'arrondi à ajouter dans l'autre. Vous pouvez également utiliser une expression avec des puissances de 10, etc.
  2. Décider du comportement correct pour les nombres négatifs. Est-ce que -4.01132141 devient -4.02 ou -4.01? Vous pourriez avoir besoin de jouer avec les fonctions SIGN et ABS pour que cela fonctionne comme vous le souhaitez.
+0

@Alex: ughhh - tu as raison. 0.004999999999999999, quelqu'un? –

1

J'ai fait face au même problème et est venu avec la déclaration suivante, cela a fonctionné très bien jusqu'ici.

select 4.01132141+(mod((ceil(4.01132141)-4.01132141)*1000,10)/1000) from dual 
0

select 4,01132141 PLAFOND (4,01132141 * 100)/100 de double

+0

Bienvenue sur Stack Overflow! S'il vous plaît modifier avec plus d'informations. Les réponses au code uniquement et «Essayez ceci» sont [déconseillées] (http://meta.stackexchange.com/questions/196187/is-try-this-bad-practice), car elles ne contiennent aucun contenu interrogeable, et ne le sont pas. expliquer pourquoi quelqu'un devrait "essayer ceci". –

0

Vous pouvez l'utiliser pour compléter en PLSQL: ROND (UrNo + (5/POWER (10, DecimalPlaces + 1)) , DecimalPlaces)