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)
Eso funciona bien, y es mucho más simple que lo que se me ocurrió :-) – Paul
Aunque debe asegurarse de que @number no sea 0. – Paul
de hecho; actualizado en consecuencia. – Brann