日期:2014-05-19  浏览次数:20720 次

求四舍六入五成双的函数
哪位大侠能帮我写一个四舍六入五成双的算法,最好是封装成函数,小弟在此感激不尽!!!

------解决方案--------------------
怎么算的?
------解决方案--------------------
5成双?0.5---> 0.55?
------解决方案--------------------
四舍六入五成双的算法:
四舍六入五考虑,即当尾数≤4时舍去,尾数为6时进位。当尾数4舍为5时,则应是末位数是奇数还是偶数,5前为偶数应将5舍去,5前为奇数应将5进位
------解决方案--------------------
是变成偶数吗
把数除2,然后四舍五入,再乘2
------解决方案--------------------
關注
------解决方案--------------------
if object_id( 'fnRound ') is not null
drop function fnRound
GO
create function fnRound(@num float,@i int)
returns varchar(20)
as
begin
declare @str varchar(20) /*转换成字符类型*/
declare @str2 varchar(20) /*小数位数后面的字符串*/
declare @str3 varchar(2) /*小数位数字符串*/
set @str = convert(varchar,@num)
set @str2 = reverse(substring(reverse(@str),1,charindex( '. ',reverse(@str)) - 1 - @i))
set @str3 = substring(@str,charindex( '. ',@str) + 1,@i)
if @str2%5 = 0 and @str3%2 = 0 /*如果符合 "五成双 "*/
set @str = substring(@str,1,charindex( '. ',@str) + @i)
else /*否则四舍五入*/
set @str = convert(varchar,round(@num,@i))
RETURN @str
end
GO

----测试
declare @num float,@num2 float,@num3 float,@num4 float,@i int
select @num = 1.45000,@num2 = 1.3500,@num3 = 1.4501,@num4 = 1.4600
set @i = 1
SELECT
dbo.fnRound(@num,@i) as [1.4500], /*五成双(4已经是偶数保持不变)*/
dbo.fnRound(@num2,@i) as [1.3500], /*五成双(将3变成偶数4)*/
dbo.fnRound(@num3,@i) as [1.4501], /*四舍五入*/
dbo.fnRound(@num4,@i) as [1.4600] /*四舍五入*/

----清除测试环境
drop function fnRound

/*结果
1.45000 1.3500 1.4501 1.4600
-------------------- -------------------- -------------------- ------
1.4 1.4 1.5 1.5
*/
------解决方案--------------------
楼上的函数有点小错误:
SELECT dbo.fnRound(1.445000,4) as [1.445]
------解决方案--------------------
mark
------解决方案--------------------
银行家算法
------解决方案--------------------
请问,hellowork那个函数怎么编译通不过呀?
create function fnRound(@num float,@i int)
returns varchar(20)
as
begin
declare @str varchar(20) /*转换成字符类型*/
declare @str2 varchar(20) /*有效数字后面的字符串*/
declare @str3 varchar(2) /*有效数字字符串*/
set @str = convert(varchar,@num) --+ replicate( '0 ',5) --【!修正了此行!】
set @str2 = stuff(@str,1,charindex( '. ',@str) + @i, ' ')
set @str3 = substring(@str,charindex( '. ',@str) + 1,@i)
if patindex( '%[^05]% ',@str) = 0 and @str3%2 = 0 /*如果符合 "五成双 "*/
set @str = substring(@str,1,charindex( '. ',@str) + @i)
else /*否则四舍五入*/
set @str = convert(varchar,round(@num,@i))
RETURN @str + replicate( '0 ',@i - len(@str3))
end

------解决方案--------------------
好贴,这个问题有点意思.
------解决方案--------------------
搂主,这种算法在哪种情景中使用?