四舍六入五成双的算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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已经是偶数保持不变)*/

相关文档
最新文档