Вот код, который я использую в примере:
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2;
PRINT @weight
Вот результат:
47
638
0
Я хотел бы знать, почему он возвращает 0
вместо 0,073667712
Вот код, который я использую в примере:
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2;
PRINT @weight
Вот результат:
47
638
0
Я хотел бы знать, почему он возвращает 0
вместо 0,073667712
Объявить set1 и set2 как float вместо целых чисел или отбросить их на float как часть вычисления:
SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);
Когда вы используете только целые числа в делении, вы получите целочисленное деление. Когда вы используете (по крайней мере один) двойной или плавающий, вы получите деление с плавающей запятой (и ответ, который вы хотите получить).
Итак, вы можете
Не просто преобразовать результат целочисленного деления в double: деление уже выполнялось как целочисленное деление, поэтому числа за десятичной точкой уже потеряны.
Потому что это целое число. Вам нужно объявить их как числа с плавающей запятой или десятичные числа или применить их к вычислению.
Просто измените нижнюю часть деления на 1.0 (или столько раз, сколько вы хотите)
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2 *1.00000;
PRINT @weight
если вы объявите его как float или любой десятичный формат, он отобразит
0
только
Например:
declare @weight float;
SET @weight= 47 / 638; PRINT @weight
Выход: 0
Если вы хотите, чтобы результат был
0,073667712
Например,
declare @weight float;
SET @weight= 47.000000000 / 638.000000000; PRINT @weight
В SQL Server прямое разделение двух целых чисел возвращает целое число, даже если результатом должно быть float. Ниже приведен пример:
--1--
declare @weird_number_float float
set @weird_number_float=22/7
select @weird_number_float
--2--
declare @weird_number_decimal decimal(18,10)
set @weird_number_decimal=22/7
select @weird_number_decimal
--3--
declare @weird_number_numeric numeric
set @weird_number_numeric=22/7
select @weird_number_numeric
--Right way
declare @weird_number float
set @weird_number=cast(22 as float)/cast(7 as float)
select @weird_number
Только последний блок вернет 3,14285714285714. Несмотря на то, что второй блок задан с правильной точностью, результат будет равен 3.00000.