SqlServer2005 用到了四舍六入五成双,结果网上找了下,没一个能行的。到处都是复制,转帖的,乱七八糟。随花时间写了一个
仅仅经过了自己少数验证,所以仅供参考,如发现错误请指正,谢谢!
--========================================
-- Author: SSQ
-- Date: 2014年11月7日
-- Desc: 四舍六入五成双
-- Demo: SELECT dbo.FnRound(1.95,1)
--========================================
CREATE FUNCTION FnRound(@num DECIMAL(18,10),@i INT)
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE
@str VARCHAR(20), --转换成字符类型
@str1 VARCHAR(20), --保留小数位之前的字符串
@str2 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)
--PRINT @str1
SET @str2 = SUBSTRING(@str,@p+1,LEN(@str)-@p)
--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 @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) --普通处理
RETURN @r
END