四舍六入五成双的算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
huangjing81 油果子 等级: 结帖率:100%
楼主 发表于: 2007-07-11 10:39:51
哪位大侠能帮我写一个四舍六入五成双的算法,最好是封装成函数,小弟在此感激不尽!!!
zjcxc 邹建 等级:
结帖率:100%
2 2 更多勋章
回复于: 2007-07-11 10:46:00
chuifengde 树上的鸟儿 等级: 结帖率:100%
2007-07-11 10:47:14
friendliu 无为 等级: 结帖率:100%
#3 得分:1 回复于: 2007-07-11 10:57:31
四舍六入五成双的算法:
四舍六入五考虑,即当尾数≤4时舍去,尾数为6时进位。当尾数4舍为5时,则应是末位数是奇数还是偶数,5前为偶数应将5舍去,5前为奇数应将5进位
tufun * * 等级: 结帖率:96.1%
#4 得分:1 回复于: 2007-07-11 11:00:53
是变成偶数吗
把数除2,然后四舍五入,再乘2
huangjing81 油果子
等级: 结帖率:100%
原 结果
1.444 1.44
1.446 1.45
以下为有效位数后一位为5的情况
1.445 1.44
1.435 1.44
1.425 1.42
1.635 1.64
如果有效位数后一位是5,则看有效位数最后一位是奇数还是偶数,如果是偶数,则舍弃,如果是奇数,则进位,跟四舍五入有这样一点区别
hellowork 一两清风 等级:
结帖率:100%
3
#7 得分:39 回复于: 2007-07-11 11:55:57
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
*/
hellowork 一两清风 等级:
结帖率:100%
3
#8 得分:0 回复于: 2007-07-11 12:02:03
/*使用楼主的测试数据
1.445 1.44 1.435 1.44 1.425 1.42
1.635 1.64
*/
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.445,@num2 = 1.435,@num3 = 1.425,@num4 = 1.635
set @i = 2 /*保留的小数位数*/
SELECT
dbo.fnRound(@num,@i) as [1.445], /*五成双(4已经是偶数保持不变)*/