在处理数据中,经常遇到 四舍五入,以及“见分进角”(即:后一位数字大于0就进位)
四舍五入:通常可以用round函数 语法:round(@data,@digit),
例如:round(23.5729,3) = 23.5730
见分进角:即后一位数字大于0就进位。
if exists (SELECT 1 FROM SYSOBJECTS WHERE ID = OBJECT_ID('DBO.CEIL_IN'))
DROP FUNCTION CEIL_IN
GO
CREATE Function ceil_in (@number varchar(20),@digit int) --两个参数,@number待处理数据;@digit需要保留几位小数。
returns decimal(18,4)
as
begin
declare @int_part varchar(10),@decimal_part varchar(10),@decimal_part1 varchar(10)
if charindex('.',@number) <> 0
begin
--对@number进行拆分,分成整数部分以及小数部分
set @int_part = left(rtrim(@number),charindex('.',@number,0))
set @decimal_part = right(rtrim(@number),len(rtrim(@number)) - charindex('.',rtrim(@number),0))
if len(@decimal_part) > @digit
begin
--对小数部分再进行拆分进而得到另一个小数
set @decimal_part1 = left(@decimal_part,@digit) + '.' + right(@decimal_part,len(@decimal_part) - @digit)
if len(ceiling(@decimal_part1)) <> @digit and left(@decimal_part1,1) <> '0'
set @number = cast((cast(cast(@number as float) as int) + 1) as varchar(10))
else
begin
--set @decimal_part = ceiling(@decimal_part1)
set @decimal_part = left('00000000000000',CHARINDEX('.',@decimal_part1) - 1 - len(ceiling(@decimal_part1))) + convert(varchar(10),ceiling(@decimal_part1))
set @number = @int_part + @decimal_part
end
end
end
return (convert(decimal(18,4),@number))
end
例如 ceil_in(23.111,2) = 23.12
优点:返回的数就是数字型的,可以直接进行运算。
注意:最终返回的是decimal(18,4)的数字,可根据需要自行调整。