Runde zu n signifikanten Zahlen in SQL
-
20-09-2019 - |
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.
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