SQL Server всегда будет давать целочисленный результат при делении двух целых чисел.
Вы можете добавить «.0» в конец фактических жестко закодированных значений или умножить на «1,0», чтобы преобразоватьзначение поля.Если вы хотите округлить, то лучший способ, который я знаю, это добавить 0,5, а затем вызвать обычную функцию ROUND.Это работает, потому что ROUND_DOWN (число + .5) всегда совпадает с ROUND_UP (число).
Вы также можете вручную преобразовать поле в число с плавающей точкой, как указали другие.
Нообратите внимание, что
round(1.0 / 2.0,0)
вернет результат с плавающей запятой , тогда как
round(cast(1 as float) / cast(2 as float),0)
даст результат integer .Так что используйте тот, который лучше всего подходит для вас.
Все это проиллюстрировано в следующем примере:
SELECT
ROUND(5/2,0) AS INTEGER_EXAMPLE
,ROUND((5.0 / 2.0),0) AS FLOATING_POINT_EXAMPLE
,ROUND(CAST(5 AS FLOAT) / CAST(2 AS FLOAT),0) AS CASTING_EXAMPLE
,ROUND((5 * 1.0) / (2 * 1.0),0) AS CONVERTED_TO_FP_EXAMPLE
,ROUND(((1 * 1.0) / (4 * 1.0)) + (1.0 / 2.0),0) AS ROUNDED_UP_EXAMPLE
Вот функция, которая будет делать округления для вас, наряду сSELECT, чтобы показать вам результаты, которые он дает.
create function roundup(@n float) returns float
as
begin
--Special case: if they give a whole number, just return it
if @n = ROUND(@n,0)
return @n;
--otherwise, add half and then round it down
declare @result float = @n;
declare @half float = (1.0 / 2.0);
set @result = round(@n + @half,0);
return @result;
end
select
dbo.roundup(0.0) as example_0
,dbo.roundup(0.3) as example_pt_three
,dbo.roundup(0.5) as example_pt_five
,dbo.roundup(0.9) as example_pt_nine