Figure da rotonda a n significative in SQL
-
20-09-2019 - |
Domanda
Vorrei essere in grado di arrotondare un numero a n cifre significative in SQL. Così:
123.456 rounded to 2sf would give 120
0.00123 rounded to 2sf would give 0.0012
Sono consapevole della funzione rotonda (), che gira a n decimali piuttosto che figure significative.
Soluzione
select round(@number,@sf-1- floor(log10(abs(@number))))
Dovrebbe fare il trucco!
Testato con successo sui tuoi due esempi.
Modifica: chiamare questa funzione su @numero = 0 non funzionerà. Dovresti aggiungere un test per questo prima di utilizzare questo codice.
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
Altri suggerimenti
Ha adattato la risposta più popolare di Brann a Mysql per coloro che vengono come me.
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
/ * Mi sentivo troppo lungo per mettere il commento */
Round (num, sf - 1 - pavimento (log10 (ABS (num)))
- La parte che svolge il lavoro - utilizza la funzione rotonda sul numero normalmente, ma viene calcolata la lunghezza da arrotondare
- Gli addominali assicurano positivi
- Log10 ottiene il numero di cifre maggiori di 0 nel numero
- Il pavimento diventa il numero intero più grande più piccolo del numero risultante
- Quindi sempre arrotonda e dà un numero intero
- SF - 1 - Floor (...) dà un numero negativo
Funziona perché rotonde rotonde (num, -ve num) a sinistra del punto decimale
Per solo un round, round (123.456, -1) e round (0,00123,4) restituire le risposte richieste ((120, 0,0012)
Potresti dividere per 100 prima di arrotondare e poi moltiplicare per 100 ...
Penso di averlo gestito.
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