Ось код, який я використовую у прикладі:
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
якщо ви оголосите його як плаваючий або будь-який десятковий формат, який він буде відображати
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.