本函数已在工作中使用验证。
函数名:sumres,参数有两个,一个是数字,一个是保留位数,返回值是一个浮点型。该函数使用和round()用法一样。
函数完整代码:
ALTER FUNCTION [dbo].[sumres](@num DECIMAL(18,10),@i INT)
RETURNS FLOAT
AS
BEGIN
DECLARE
@str VARCHAR(20), --转换成字符类型
@str1 VARCHAR(20), --保留小数位之前的字符串
@str6 VARCHAR(20), --int=0时,小数前一位
@str2 VARCHAR(20), --小数位数后面的字符串
@str7 VARCHAR(20), --有效小数位后面的字符串
@str3 VARCHAR(2), --小数位奇偶判断
@str4 VARCHAR(1), --是不是5
@p INT, --小数点位置
@r DECIMAL(18,10), --保留位置之前数值
@v DECIMAL(18,10) --进位时增加值
SET @v='0.'+RIGHT('000000000001',@i)
SET @str = CONVERT(VARCHAR(200), @num)
--PRINT @str
SET @p=CHARINDEX('.',@str)
SET @str1=SUBSTRING(@str,0,@p+1+@i)
SET @str6=SUBSTRING(@str,@p-1,1)
--PRINT @str1
SET @str2 = SUBSTRING(@str,@p+1,LEN(@str)-@p)
SET @str7 = SUBSTRING(@str,@p+@i+2,LEN(@str)-@p)
SET @str7=replace(rtrim(replace(@str7,'0',' ')),' ','0')
--PRINT @str2
--指定小数位奇偶判断
SET @str3=SUBSTRING(@str2,@i,1)
--PRINT @str3
--截取保留小数的后一位,看是不是5
SET @str4=SUBSTRING(@str2,@i+1,1)
--PRINT @str4
IF @str4='5' --是5
BEGIN
IF @str7=0
BEGIN
--RETURN @str4
IF @i=0
BEGIN
IF @str6%2<>0 --奇数
BEGIN
SET @r=ROUND(CONVERT(DECIMAL(18,10),@num),@i) --普通处理
END
ELSE
SET @r=CONVERT(DECIMAL(18,10),@str1)
END
ELSE
IF @str3%2<>0 --奇数
BEGIN
SET @r=CONVERT(DECIMAL(18,10),@str1)+ @v --进位
END
ELSE
SET @r=CONVERT(DECIMAL(18,10),@str1)
END
ELSE
SET @r=ROUND(CONVERT(DECIMAL(18,10),@num),@i) --普通处理
END
ELSE
SET @r=ROUND(CONVERT(DECIMAL(18,10),@num),@i) --普通处理
RETURN @r
END