Округлить до значимых цифр в SQL - PullRequest
20 голосов
/ 17 декабря 2009

Я хотел бы иметь возможность округлять число до n значащих цифр в SQL. Итак:

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

Мне известна функция ROUND (), которая округляет число знаков после запятой, а не значащие цифры.

Ответы [ 4 ]

20 голосов
/ 17 декабря 2009

select round(@number,@sf-1- floor(log10(abs(@number)))) должен добиться цели!

Успешно протестировано на ваших двух примерах.

Редактировать: вызов этой функции при @ number = 0 не будет работать. Вы должны добавить тест для этого перед использованием этого кода.

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
1 голос
/ 20 июля 2016

Адаптирован самый популярный ответ Бранна на MySQL для тех, кто похож на меня.

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

/ * Слишком длинный, чтобы оставить комментарий * /

ROUND (число,sf - 1 - FLOOR (LOG10 (ABS (num))))

  • Часть, которая выполняет работу - использует функцию ROUND для числа в обычном порядке, но вычисляется длина, округляемая до
  • ABS обеспечивает положительное значение
  • LOG10 получает количество цифр больше 0 в числе
  • FLOOR получает наибольшее целое число меньше, чем результирующее число
  • Так всегдаокругляет и дает целое число
  • sf - 1 - FLOOR (...) дает отрицательное число
  • работает, потому что ROUND (num, -ve num) округляется слева отдесятичная точка

  • Только один раз, ROUND (123,456, -1) и ROUND (0,00123,4) возвращают запрошенные ответы ((120, 0,0012)

0 голосов
/ 17 декабря 2009

Я думаю, что справился.

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 голосов
/ 17 декабря 2009

Вы можете разделить на 100 перед округлением, а затем умножить на 100 ...

...