2009-12-17 19 views
16

Vorrei poter arrotondare un numero a n cifre significative in SQL. Quindi:Arrotondato a n Figure significative in SQL

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

sono consapevole della funzione ROUND(), che arrotonda al n cifre decimali anziché cifre significative.

risposta

16

select round(@number,@sf-1- floor(log10(abs(@number)))) dovrebbe fare il trucco!

Testato con successo sui due esempi.

Modifica: la chiamata di questa funzione su @ numero = 0 non funziona. È necessario 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 
+0

Che funziona bene, ed è molto più semplice di quello che mi è venuto in mente :-) – Paul

+0

Anche se devi assicurarti che @number non sia 0. – Paul

+1

in effetti; aggiornato di conseguenza. – Brann

0

Si potrebbe dividere per 100 prima di arrotondare e poi moltiplicando per 100 ...

+0

Questo non funzionerebbe sul secondo esempio – Paul

+1

Divisione, pavimentazione e moltiplicazione è un modo di troncare le cifre decimali, piuttosto che arrotondare a cifre significative. – Paul

0

Penso di esserci riuscito.

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

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 

/* sentiva troppo lungo per mettere in commento */

ROUND (num, sf - 1 - PIANO (LOG10 (ABS (num))))

  • La parte che funziona - utilizza la funzione ROUND sul numero come normale, ma la lunghezza da arrotondare viene calcolata
  • ABS assicura positivo
  • LOG10 ottiene il numero di cifre maggiore di 0 nel numero
  • PIANO ottiene il più grande intero minore del numero risultante
  • arrotonda Quindi, sempre verso il basso e dà un intero
  • sf - 1 - PIANO (...) dà un numero negativo
  • opere perché ROUND (num, ve num) arrotonda alla sinistra del punto di

  • decimale per solo un una tantum, ROUND (123.456, -1) e Round (0.00123,4) restituire le risposte richiesti ((120, 0,0012)

Problemi correlati