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
Antworten:
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
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.
Weil es eine ganze Zahl ist. Sie müssen sie als Gleitkommazahlen oder Dezimalstellen deklarieren oder in der Berechnung in solche umwandeln.
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
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
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.