SQL Server, деление возвращает ноль

Вот код, который я использую в примере:

 PRINT @set1
 PRINT @set2

 SET @weight= @set1 / @set2;
 PRINT @weight

Вот результат:

47
638
0

Я хотел бы знать, почему он возвращает 0 вместо 0,073667712

Ответ 1

Объявить set1 и set2 как float вместо целых чисел или отбросить их на float как часть вычисления:

SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);

Ответ 2

Когда вы используете только целые числа в делении, вы получите целочисленное деление. Когда вы используете (по крайней мере один) двойной или плавающий, вы получите деление с плавающей запятой (и ответ, который вы хотите получить).

Итак, вы можете

  • объявить одну или обе переменные как float/double
  • лить одну или обе переменные в float/double.

Не просто преобразовать результат целочисленного деления в double: деление уже выполнялось как целочисленное деление, поэтому числа за десятичной точкой уже потеряны.

Ответ 3

Потому что это целое число. Вам нужно объявить их как числа с плавающей запятой или десятичные числа или применить их к вычислению.

Ответ 4

Просто измените нижнюю часть деления на 1.0 (или столько раз, сколько вы хотите)

PRINT @set1 
PRINT @set2 
SET @weight= @set1 / @set2 *1.00000; 
PRINT @weight

Ответ 5

если вы объявите его как 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

Ответ 6

В 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.