2009-12-17 49 views
16

Me gustaría poder redondear un número a n cifras significativas en SQL. Entonces:Redondeo a n Cifras significativas en SQL

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

Conozco la función ROUND(), que se redondea con n lugares decimales en lugar de cifras significativas.

Respuesta

16

select round(@number,@sf-1- floor(log10(abs(@number)))) debe hacer el truco!

Probado con éxito en sus dos ejemplos.

Editar: Llamar a esta función en @ número = 0 no funcionará. Debe agregar una prueba para esto antes de usar este código.

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

Eso funciona bien, y es mucho más simple que lo que se me ocurrió :-) – Paul

+0

Aunque debe asegurarse de que @number no sea 0. – Paul

+1

de hecho; actualizado en consecuencia. – Brann

0

podría dividir por 100 antes de redondear y luego multiplicando por 100 ...

+0

Eso no funcionaría en el segundo ejemplo – Paul

+1

La división, el piso y la multiplicación es una forma de truncar a decimales, en lugar de redondear a cifras significativas. – Paul

0

Creo que lo he logrado.

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

Adaptado la respuesta más popular por Brann a MySQL para los que se parecen a mí.

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 

/* se sentía demasiado tiempo para poner en el comentario */

REDONDO (num, SF - 1 - PISO (LOG10 (ABS (num))))

  • La parte que funciona el - utiliza la función redonda sobre el número como normal, pero la longitud que se redondea a se calcula
  • ABS asegura positivo
  • LOG10 obtiene el número de dígitos mayor que 0 en el número
  • PISO obtiene el mayor entero menor que el número resultante
  • Así que siempre redondea hacia abajo y da un entero
  • SF - 1 - floor (...) da un número negativo
  • obras porque REDONDO (num, num -ve) se redondea a la izquierda del punto de

  • decimal Por solo un, ROUND (123.456, -1) y redondo (0.00123,4) devolver las respuestas solicitados ((120, 0,0012)