PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 14/03/2014 15:57:26

Postgres.0
Membre

arrondi superieur

Bonjour,

je suis à la recherche du'une fonction d'arrondi supérieur qui me donne le résultat suivant:

round(123.121958,2) = 123.13

Dans excel ça existe mais PG, je ne la trouve pas!

Merci

Hors ligne

#2 14/03/2014 16:29:57

arthurr
Membre

Re : arrondi superieur

à mon avis, vous allez devoir passer par un procédure stockée maison ...

Hors ligne

#3 14/03/2014 16:39:08

Postgres.0
Membre

Re : arrondi superieur

Ok, merci!

Hors ligne

#4 19/03/2014 11:44:38

Postgres.0
Membre

Re : arrondi superieur

Si quelqu'un a une piste pour compter le nombre de chiffre après une virgule je suis preneur.
Je suis également preneur de toute indication qui pourra m'aider à écrire la procédure stockée évoquée par arthur.

Hors ligne

#5 19/03/2014 17:23:14

arthurr
Membre

Re : arrondi superieur

Testé chez moi :

CREATE OR REPLACE function special_round(p_to_round decimal,p_nbre_decimal integer) RETURNS decimal AS $$
DECLARE
	p_return decimal;
BEGIN
	IF(round(p_to_round,p_nbre_decimal)<p_to_round) THEN
		p_to_round := p_to_round + 9 /10^(p_nbre_decimal+1);
	END IF;
	p_return := round(p_to_round,p_nbre_decimal);
	RETURN p_return;
END;
$$ LANGUAGE plpgsql;

Tests :

test=# select * from special_round(123.121958,2);
 special_round 
---------------
        123.13
(1 row)
test=# select * from special_round(123.120,3);
 special_round 
---------------
       123.120
(1 row)

Hors ligne

#6 20/03/2014 17:03:25

Postgres.0
Membre

Re : arrondi superieur

Merci arthur!

Hors ligne

#7 20/03/2014 17:49:43

Postgres.0
Membre

Re : arrondi superieur

SELECT arrondir_sup(1.00000009,2) ;
arrondir_sup
-----------------
             1.01

alors que le résultat attendu est 1.10

Hors ligne

#8 20/03/2014 17:59:54

arthurr
Membre

Re : arrondi superieur

j'ai du mal à suivre ...
premier exemple que tu donnes :

round(123.121958,2) = 123.13

puis :

SELECT arrondir_sup(1.00000009,2) ;

Ce dernier exemple demande 2 chiffre après la virgule arrondi au supérieur, donc 1.01
Pour moi, si tu veux 1.10, tu fais :

postgres=# SELECT special_round(1.00000009,1);
 special_round 
---------------
           1.1

Hors ligne

#9 20/03/2014 18:25:10

Postgres.0
Membre

Re : arrondi superieur

OK merci, je me suis vautré.

Hors ligne

#10 28/03/2014 11:06:23

Postgres.0
Membre

Re : arrondi superieur

Je mets la solution que j'ai utilisé pour ceux que ça intéresserait!

CREATE OR REPLACE FUNCTION arrondir_sup_type_excel ( prix_htc numeric) RETURNS numeric AS
$$
DECLARE
   v_prix numeric;
   S_QUERY    text;
   v_digit    text;
BEGIN
   v_prix := trunc(prix_htc,3);


S_QUERY := 'SELECT SUBSTR('||quote_literal(v_prix) || ',char_length(' || quote_literal(v_prix) ||'),char_length('|| quote_literal(v_prix) ||'))';

   EXECUTE S_QUERY INTO v_digit;
  IF v_digit = '0' THEN
    RETURN trunc(v_prix,2);
  ELSE
    RETURN trunc(v_prix,2) +0.01;
  END IF;



END

$$
LANGUAGE 'plpgsql'
STABLE
;

Comme j'ai affaire à des utilisateurs ils m'ont suggérés  que dans excel arrondir_sup(1.00000009,2) = 1.10.
Alors que pour moi c'est bien 1.01.

Merci arthurr pour tes réponses.

Hors ligne

Pied de page des forums