Вот код, который я использую в примере:
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2;
PRINT @weight
Вот результат:
47
638
0
Я хотел бы знать, почему он возвращается 0вместо0,073667712
Ответы:
Когда вы используете только целые числа в делении, вы получите целочисленное деление. Когда вы используете (хотя бы одно) double или float, вы получите деление с плавающей запятой (и ответ, который хотите получить).
Так что вы можете
Не приводите результат целочисленного деления к удвоению: деление уже было выполнено как целочисленное деление, поэтому числа после десятичной дроби уже потеряны.
Потому что это целое число. Вам нужно объявить их как числа с плавающей запятой или десятичные дроби, или привести к таковым в вычислениях.
Просто умножьте нижнюю часть деления на 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 прямое деление на два целых числа возвращает целое число, даже если результатом должно быть число с плавающей запятой. Ниже приведен пример, чтобы объяснить это:
--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.