Адаптирован самый популярный ответ Бранна на MySQL для тех, кто похож на меня.
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
/ * Слишком длинный, чтобы оставить комментарий * /
ROUND (число,sf - 1 - FLOOR (LOG10 (ABS (num))))
- Часть, которая выполняет работу - использует функцию ROUND для числа в обычном порядке, но вычисляется длина, округляемая до
- ABS обеспечивает положительное значение
- LOG10 получает количество цифр больше 0 в числе
- FLOOR получает наибольшее целое число меньше, чем результирующее число
- Так всегдаокругляет и дает целое число
- sf - 1 - FLOOR (...) дает отрицательное число
работает, потому что ROUND (num, -ve num) округляется слева отдесятичная точка
Только один раз, ROUND (123,456, -1) и ROUND (0,00123,4) возвращают запрошенные ответы ((120, 0,0012)