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


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

 PRINT @set1
 PRINT @set2

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

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

47
638
0

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

6 68
sql

6 ответов:

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

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

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

вы можете

  1. объявите одну или обе переменные как float / double
  2. литая одной или обеих переменных с плавающей точкой или двойной.

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

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

просто mutiply нижняя часть деления на 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.