SQL Server, поділ повертає нуль


86

Ось код, який я використовую у прикладі:

 PRINT @set1
 PRINT @set2

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

Ось результат:

47
638
0

Я хотів би знати, чому він повертається 0замість0,073667712


це "int": DECLARE @weight INT
Roch

Відповіді:


152

Або оголосіть set1 і set2 як плаваючі замість цілих чисел, або передайте їх плаваючим як частину обчислення:

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

24

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

Тож можна

  1. оголосити одну або обидві змінні як float / double
  2. привести одну або обидві змінні до плаваючої / подвійної.

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


4
+1, тому що, на мою думку, ви це пояснили трохи краще і згадали, що лише одне із значень має бути float / double
Chaulky

11

Тому що це ціле число. Вам потрібно оголосити їх числами з плаваючою комою або десятковими крапками, або присвоїти їм такі в розрахунку.


Якщо я зміню змінну @weight на плаваючу, це достатньо?
Рох

10

Просто зменшіть нижню частину поділу на 1,0 (або скільки завгодно десяткових знаків)

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

Спасибі людино. Ваш код допоміг мені відповісти на це - stackoverflow.com/questions/20532187/... Чи можете ви сказати мені, як скоротити зайві нулі, викликані цим множенням? Дякую.
Trojan.ZBOT

2

якщо ви оголосите його як плаваючий або будь-який десятковий формат, який він буде відображати

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 не вказаний у змінній.
Рох

тож вам потрібно кинути як @ set1, так і @ set2, щоб плавати :)
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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.