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