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

86

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

 PRINT @set1
 PRINT @set2

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

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

47
638
0

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

Рох
источник
это 'int': DECLARE @weight INT
Рох

Ответы:

152

Либо объявите set1 и set2 как числа с плавающей запятой вместо целых чисел, либо преобразуйте их в числа с плавающей запятой как часть вычисления:

SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);
Мартин
источник
24

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

Так что вы можете

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

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

Ханс Кеинг
источник
4
+1 потому что, я думаю, вы объяснили это немного лучше и упомянули, что только одно из значений должно быть float / double
Chaulky
11

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


источник
Если я изменю переменную @weight на float, этого будет достаточно?
Roch
10

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

PRINT @set1 
PRINT @set2 
SET @weight= @set1 / @set2 *1.00000; 
PRINT @weight
HLGEM
источник
Спасибо чувак. Ваш код помог мне ответить на этот вопрос - stackoverflow.com/questions/20532187/… Не могли бы вы сказать мне, как обрезать лишние нули, вызванные этим умножением? Спасибо.
Trojan.ZBOT
2

если вы объявите его как 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
аниш
источник
Хм, хорошо, я понял, но два числа, которые я хочу разделить, являются переменными, и, похоже, это не сработает, если в переменной не указано .0000.
Roch
поэтому вам нужно преобразовать как @ set1, так и @ set2 в float :)
anishMarokey
1

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

Суат Атан PhD
источник