SQL Server, Division gibt Null zurück

86

Hier ist der Code, den ich im Beispiel verwende:

 PRINT @set1
 PRINT @set2

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

Hier ist das Ergebnis:

47
638
0

Ich würde gerne wissen , warum es zurückkehrt 0statt0,073667712

Roch
quelle
Es ist ein 'int': DECLARE @weight INT
Roch

Antworten:

152

Deklarieren Sie entweder set1 und set2 als Floats anstelle von Ganzzahlen oder wandeln Sie sie als Teil der Berechnung in Floats um:

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

Wenn Sie in einer Division nur Ganzzahlen verwenden, erhalten Sie eine Ganzzahldivision. Wenn Sie (mindestens ein) Double oder Float verwenden, erhalten Sie eine Gleitkommadivision (und die Antwort, die Sie erhalten möchten).

Also kannst du

  1. Deklarieren Sie eine oder beide Variablen als float / double
  2. Wandle eine oder beide Variablen in float / double um.

Setzen Sie das Ergebnis der Ganzzahldivision nicht einfach auf doppelt: Die Division wurde bereits als Ganzzahldivision ausgeführt, sodass die Zahlen hinter der Dezimalstelle bereits verloren gehen.

Hans Keing
quelle
4
+1, weil ich denke, Sie haben es ein wenig besser erklärt und erwähnt, dass nur einer der Werte ein float / double sein muss
Chaulky
11

Weil es eine ganze Zahl ist. Sie müssen sie als Gleitkommazahlen oder Dezimalstellen deklarieren oder in der Berechnung in solche umwandeln.


quelle
Wenn ich die Variable @weight in float ändere, reicht das aus?
Roch
10

Multiplizieren Sie einfach den unteren Teil der Division mit 1,0 (oder so vielen Dezimalstellen, wie Sie möchten).

PRINT @set1 
PRINT @set2 
SET @weight= @set1 / @set2 *1.00000; 
PRINT @weight
HLGEM
quelle
Danke, Mann. Ihr Code hat mir bei der Beantwortung dieser Frage geholfen - stackoverflow.com/questions/20532187/… Können Sie mir sagen, wie ich die durch diese Multiplikation verursachten zusätzlichen Nullen abschneiden kann? Vielen Dank.
Trojan.ZBOT
2

Wenn Sie es als float oder als Dezimalformat deklarieren, wird es angezeigt

0

nur

Z.B :

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

Ausgabe: 0

Wenn Sie die Ausgabe als möchten

0,073667712

Z.B

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight
anishMarokey
quelle
Hum ok, ich verstehe es jetzt, aber die beiden Zahlen, die ich teilen möchte, sind Variablen, und es scheint nicht zu funktionieren, wenn die .0000 nicht in der Variablen angegeben ist.
Roch
Sie müssen also sowohl @ set1 als auch @ set2 umsetzen, um zu schweben :)
anishMarokey
1

In SQL Server gibt die direkte Division von zwei Ganzzahlen eine Ganzzahl zurück, auch wenn das Ergebnis der Gleitkommawert sein sollte. Es gibt unten ein Beispiel, um es zu vermitteln:

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

Nur der letzte Block gibt den 3.14285714285714 zurück. Trotz des zweiten mit der richtigen Genauigkeit definierten Blocks wird das Ergebnis 3.00000 sein.

Suat Atan PhD
quelle