2009-12-17 5 views
16

Je souhaiterais pouvoir arrondir un nombre à n chiffres significatifs dans SQL. Donc:Arrondir à n Chiffres significatifs dans SQL

123.456 rounded to 2sf would give 120 
0.0rounded to 2sf would give 0.0012 

Je connais la fonction ROUND(), qui arrondit à n décimales plutôt que des chiffres significatifs.

Répondre

16

select round(@number,@sf-1- floor(log10(abs(@number)))) devrait faire l'affaire!

Testé avec succès sur vos deux exemples. Éditer: Appeler cette fonction sur @ nombre = 0 ne fonctionnera pas. Vous devriez ajouter un test pour cela avant d'utiliser ce code.

create function sfround(@number float, @sf int) returns float as 
begin 
    declare @r float 
    select @r = case when @number = 0 then 0 else round(@number ,@sf -1-floor(log10(abs(@number)))) end 
    return (@r) 
end 
+0

Cela fonctionne bien, et est beaucoup plus simple que ce que je suis arrivé :-) – Paul

+0

Bien que doit assurer @number n'est pas 0. – Paul

+1

en effet; mis à jour en conséquence. – Brann

0

Vous pouvez diviser par 100 avant d'arrondir puis multiplier par 100 ...

+0

Cela ne marcherait pas sur le deuxième exemple – Paul

+1

Diviser, parquer et multiplier est un moyen de tronquer aux décimales, plutôt que d'arrondir à des chiffres significatifs. – Paul

0

Je pense que je l'ai réussi.

CREATE FUNCTION RoundSigFig(@Number float, @Figures int) 
RETURNS float 
AS 
BEGIN 

    DECLARE @Answer float; 

    SET @Answer = (
    SELECT 
     CASE WHEN intPower IS NULL THEN 0 
     ELSE FLOOR(fltNumber * POWER(CAST(10 AS float), intPower) + 0.5) 
       * POWER(CAST(10 AS float), -intPower) 
     END AS ans 
    FROM (
     SELECT 
      @Number AS fltNumber, 
      CASE WHEN @Number > 0 
       THEN -((CEILING(LOG10(@Number)) - @Figures)) 
      WHEN @Number < 0 
       THEN -((FLOOR(LOG10(@Number)) - @Figures)) 
      ELSE NULL END AS intPower  
     ) t 
    ); 

    RETURN @Answer; 
END 
0

Adapté la réponse la plus populaire par Brann à MySQL pour ceux qui viennent me ressembler.

CREATE FUNCTION `sfround`(num FLOAT, sf INT) # creates the function 
RETURNS float # defines output type 
DETERMINISTIC# given input, will return same output 

BEGIN 

    DECLARE r FLOAT; # make a variable called r, defined as a float 

    IF(num IS NULL OR num = 0) THEN # ensure the number exists, and isn't 0 
     SET r = num; # if it is; leave alone 

    ELSE 
     SET r = ROUND(num, sf - 1 - FLOOR(LOG10(ABS(num)))); 
    /* see below*/ 
    END IF; 

    RETURN (r); 

END 

/* Felt trop de temps pour mettre en commentaire */

ROND (num, sf - 1 - FLOOR (log10 (ABS (num))))

  • La partie qui fait le travail - utilise la fonction ronde sur le nombre comme d'habitude, mais la longueur à arrondir est calculée à
  • ABS assure positif
  • LOG10 obtient le nombre de chiffres supérieur à 0 dans le nombre
  • FLOOR obtient le plus grand nombre entier inférieur au nombre résultant
  • donc toujours arrondit et donne un entier
  • sf - 1 - FLOOR (...) donne un nombre négatif
  • fonctionne parce que ROND (num, -ve num) arrondit à la gauche de la virgule

  • pour seulement une large ROND (123.456, -1) et ROND (0.00123,4) retourner les réponses demandées ((120, 0,0012)

Questions connexes