Я новичок в MySQL, поэтому прошу прощения, если что-то из этого является относительно элементарным.
Я пытаюсь написать хранимую функцию для округления цифры до определенного числа значащих цифр. У меня есть функция, которая, по идее, должна работать - я обратился к другому полезному StackOverflow, чтобы закрепить логику ( округление до n значащих цифр в SQL ). Тем не менее, числа от 1 до -1 (исключая 0, потому что я бросил в улове с краевым регистром) не могут округляться соответствующим образом; например, вызов sfround(.00123456789, 5)
, который должен дать 0,0012345, вместо этого дает 0,0012345999712124467.
В попытке исправить это, я надеялся усечь цифры от 1 до -1 (исключая 0) до числа тривиальных нулей ПЛЮС до количества необходимых сигн фиг. В приведенном ниже коде предложение IF предназначено для выполнения этого усечения. Однако я обнаружил, что всякий раз, когда я включаю это предложение IF, это приводит к ошибке:
'Код ошибки: 1064. У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'DECLARE numDigits INT;
SET numDigits = FLOOR (LOG10 (ABS (число))); #total d 'в строке 5).
Даже когда я экспериментировал с очень простым оператором IF, таким как
IF (5 = 5) THEN DECLARE dummyvar INT; END IF;
Я все еще получаю ту же ошибку в этой строке, что заставляет меня думать, что я упускаю что-то простое в моем синтаксисе MySQL для предложения IF.
DELIMITER $$
USE `vg_summary1`$$
DROP FUNCTION IF EXISTS `sfround`$$
CREATE FUNCTION 'sfround`(number FLOAT, sf INT) RETURNS FLOAT
DETERMINISTIC
BEGIN
IF ((ABS(number) < 1) AND (ABS(number) > 0)) THEN
DECLARE numDigits INT;
SET numDigits = FLOOR(LOG10(ABS(number)));
DECLARE trivialDigits INT;
SET trivialDigits = 0;
DECLARE placeholder FLOAT;
SET placeholder = ABS(number);
WHILE placeholder < 1
BEGIN
placeholder = placeholder * 10;
IF (placeholder < 1) THEN trivialDigits = trivialDigits + 1;
END IF;
END;
DECLARE keptDigits = trivialDigits + sf;
DECLARE special_answer FLOAT;
SET special_answer = ROUND(number, keptDigits-1-FLOOR(LOG10(ABS(number))));
RETURN special_answer;
END IF;
DECLARE r FLOAT;
SET r = CASE WHEN number = 0 THEN 0 ELSE ROUND(number, sf-1-FLOOR(LOG10(ABS(number)))) END;
RETURN r;
END$$
DELIMITER ;
Если у кого-либо есть какие-либо предложения в отношении синтаксических ошибок или более логичных способов исправить исходную ошибку, я был бы очень признателен, чтобы их услышать! Большое вам спасибо!