2009年6月10日 星期三

數值進行四捨六入五取雙的判斷

要呈現的結果:
1.4→1
1.6→2
1.5→2
2.5→2

ALTER FUNCTION [dbo].[FN_ChangeNumber](@money decimal(18,2))
RETURNS Int
AS

BEGIN
declare @intvalue int,@decimalvalue int,@retvalue int

--取整數和小數第一位
select @intvalue=substring(Convert(nvarchar(20),@money),1, charindex('.', Convert(nvarchar(20),@money))-1) , @decimalvalue=substring(substring(Convert(nvarchar(20),@money), charindex('.', Convert(nvarchar(20),@money))+1 , len(Convert(nvarchar(20),@money))-charindex('.', Convert(nvarchar(20),@money))) ,1,1)

if(@decimalvalue<=4)begin set @retvalue=@intvalue end

if(@decimalvalue>=6)begin set @retvalue=@intvalue+1 end

if(@decimalvalue=5)begin
if(@intvalue%2=0) set @retvalue=@intvalue
else set @retvalue=@intvalue+1
end

RETURN @retvalue
END

感謝Keen協助

1 則留言:

豆舅 提到...

我修改一下取整數及小數第一位的程式,這樣在程式日後的閱讀上會比較輕鬆
DECLARE @intvalue INT
DECLARE @decimalvalue INT
DECLARE @retvalue INT

--取整數和小數第一位
--@money%1 為小數位
SELECT @intvalue= @money - (@money%1)
SELECT @decimalvalue = LEFT(REPLACE(CAST(@money-1 AS VARCHAR), '0.', ''), 1) --去除小數符號及前面的0,並取小數第一位
IF(@decimalvalue<=4)
BEGIN
SET @retvalue=@intvalue
END

IF(@decimalvalue>=6)
BEGIN
SET @retvalue=@intvalue+1
END

IF(@decimalvalue=5)
BEGIN
IF(@intvalue%2=0)
SET @retvalue=@intvalue
ELSE
SET @retvalue=@intvalue+1
END

RETURN @retvalue