Frage

Ich möchte in der Lage sein, eine Zahl auf n signifikante Zahlen in SQL zu runden. So:

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

Ich bin mir der runden () -Funktion bewusst, die eher auf n -Dezimalstellen als zu signifikanten Zahlen rundet.

War es hilfreich?

Lösung

select round(@number,@sf-1- floor(log10(abs(@number)))) Sollte den Trick machen!

Erfolgreich auf Ihre beiden Beispiele getestet.

Bearbeiten: Aufrufen dieser Funktion auf @number = 0 funktioniert nicht. Sie sollten einen Test dafür hinzufügen, bevor Sie diesen Code verwenden.

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

Andere Tipps

Adaptierte die beliebteste Antwort von Brann an MySQL für diejenigen, die wie ich aussehen.

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

/ * Fühlte sich zu lange an, um einen Kommentar abzugeben */

Rund (num, sf - 1 - föden (log10 (ABS (num))))

  • Der Teil, der die Arbeit erledigt - verwendet die runde Funktion auf der Zahl wie gewohnt, aber die zugerundete Länge wird berechnet
  • ABS sorgt positiv
  • Log10 erhält die Anzahl der Ziffern größer als 0 in der Zahl
  • Der Boden bekommt die größte Ganzzahl kleiner als die resultierende Zahl
  • Also rundet sich immer rund und gibt eine Ganzzahl
  • SF - 1 - Boden (...) gibt eine negative Zahl an
  • Funktioniert, weil runde (num, -ve num) links vom Dezimalpunkt runden

  • Für nur eine Runde (123,456, -1) und rund (0,00123,4) geben Sie die angeforderten Antworten zurück ((120, 0,0012).

Sie könnten sich vor dem Rundenden um 100 teilen und dann mit 100 ... multiplizieren ...

Ich glaube, ich habe es geschafft.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top