Nossa, Obrigado Datilas!
como aqui usamos firebird 2.5, converti sua função em procedure, segue a contribuição tb:
CREATE OR ALTER PROCEDURE SP_UDF_ROUNDABNT (
AVALOR DOUBLE PRECISION,
ADECIMAIS SMALLINT)
RETURNS
(
VALOR DOUBLE PRECISION
)
AS
DECLARE VARIABLE CDECIMAIS VARCHAR(100);
DECLARE VARIABLE VLRSTR VARCHAR(100);
DECLARE VARIABLE NSUBSEQUENTE SMALLINT;
DECLARE VARIABLE POSPONTO SMALLINT;
BEGIN
VLRSTR = CAST(AVALOR AS VARCHAR(100));
POSPONTO = POSITION('.',VLRSTR);
CDECIMAIS = SUBSTRING(VLRSTR FROM POSPONTO+1 FOR CHAR_LENGTH(VLRSTR));
NSUBSEQUENTE = ADECIMAIS+1;
IF (:ADECIMAIS < 1) THEN
BEGIN
VALOR = TRUNC(AVALOR);
SUSPEND;
exit;
END
ELSE
IF (CHAR_LENGTH(CDECIMAIS) <= :ADECIMAIS) THEN
BEGIN
VALOR = AVALOR;
SUSPEND;
exit;
END
ELSE
BEGIN
IF ((CAST(SUBSTRING(CDECIMAIS FROM NSUBSEQUENTE FOR 1) AS INTEGER) > 5) OR
(CAST(SUBSTRING(CDECIMAIS FROM NSUBSEQUENTE FOR 1)AS DOUBLE PRECISION) < 5)) THEN
BEGIN
VALOR = ROUND(AVALOR,ADECIMAIS);
SUSPEND;
exit;
END
ELSE
IF (CAST(SUBSTRING(CDECIMAIS FROM NSUBSEQUENTE FOR 1)AS DOUBLE PRECISION) = 5) THEN
begin
IF (MOD(CAST(SUBSTRING(CDECIMAIS FROM ADECIMAIS FOR 1)AS DOUBLE PRECISION) ,2) <> 0) THEN
BEGIN
VALOR = ROUND(AVALOR,ADECIMAIS);
SUSPEND;
exit;
END
ELSE IF (CAST(SUBSTRING(CDECIMAIS FROM NSUBSEQUENTE+1 FOR 1)AS DOUBLE PRECISION) > 0) THEN
BEGIN
VALOR = ROUND(AVALOR,ADECIMAIS);
SUSPEND;
exit;
END
ELSE
begin
VALOR = TRUNC(AVALOR,ADECIMAIS);
SUSPEND;
exit;
END
end
END
END
Abraço!