Question

Je voudrais être en mesure d'arrondir un nombre à n chiffres significatifs de SQL. Alors:

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

Je suis conscient de la fonction ronde (), qui tourne à n décimales plutôt que des chiffres significatifs.

Était-ce utile?

La solution

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

Testé avec succès sur vos deux exemples.

Edit: appeler cette fonction sur @ numéro = 0 ne fonctionnera pas. Vous devez 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

Autres conseils

Adapté la réponse la plus populaire de Brann à MySQL pour ceux qui viennent comme moi.

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

/ * Je me sentais trop longtemps pour faire commentaire * /

Round (num, sf - 1 - plancher (log10 (ABS (num))))

  • La pièce qui fait le travail - utilise la fonction ronde sur le nombre comme d'habitude, mais la longueur à arrondir est calculée
  • ABS garantit positif
  • Log10 obtient le nombre de chiffres supérieurs à 0 dans le nombre
  • Le sol obtient le plus grand entier plus petit que le nombre résultant
  • Alors toujours en bas et donne un entier
  • SF - 1 - Floor (...) donne un nombre négatif
  • fonctionne parce que rond (num, -ve num) tourne à gauche du point décimal

  • Pour un seul, rond (123,456, -1) et ronde (0,00123,4) renvoyez les réponses demandées ((120, 0,0012)

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

Je pense que je l'ai géré.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top