Pregunta

Me gustaría poder redondear un número a n cifras significativas en SQL. Asi que:

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

Soy consciente de la función redonda (), que redondea a los lugares decimales en lugar de figuras significativas.

¿Fue útil?

Solución

select round(@number,@sf-1- floor(log10(abs(@number)))) ¡Debería 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

Otros consejos

Adaptó la respuesta más popular de Brann a MySQL para aquellos que vienen como yo.

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

/ * Me sentí demasiado tiempo para hacer comentarios */

Redonda (NUM, SF - 1 - Piso (Log10 (ABS (NUM))))

  • La parte que realiza el trabajo: utiliza la función redonda en el número normal, pero la longitud a la que se redondea se calcula
  • ABS asegura positivo
  • Log10 obtiene el número de dígitos superiores a 0 en el número
  • El piso hace que el número entero más grande sea más pequeño que el número resultante
  • Así que siempre redondea y da un entero
  • sf - 1 - piso (...) da un número negativo
  • Funciona porque redondea (num, -ve num) a la izquierda del punto decimal

  • Solo para una ronda (123.456, -1) y ronda (0.00123,4) devuelve las respuestas solicitadas ((120, 0.0012)

Podrías dividir por 100 antes de redondear y luego multiplicar por 100 ...

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top