float und real sind beide ungefähre Datentypen für Gleitkommazahlen.
real ist das gleiche wie float (24). Wenn Sie float ohne Suffix deklarieren, dann bedeutet das float (53).
Sie konvertieren also von real (das ist float (24)) zu float (53). Sie machen einfach die Zahlen präziser.
float (24) hat eine Genauigkeit von 7 Ziffern und float (53) hat eine Genauigkeit von 15 Ziffern.
See Bücher Online> float und real (Transact-SQL): https://msdn.microsoft.com/en-GB/library/ms173773.aspx
Wenn wir Ihr Beispiel wiederholen und die Variablen ohne Konvertierung anzuzeigen, können wir mit 7 Ziffern Genauigkeit sehen, dass die Real-Variable angezeigt und Schwimmer Variable wird mit 14 Ziffern Genauigkeit angezeigt, was ist genau das, was Sie einstellen.
DECLARE @realVariable as real,
@floatVariable as float;
-- Set to a number with 14 digits precision
SET @realVariable=152304.11999512;
SET @floatVariable=152304.11999512;
SELECT @realVariable AS '@realVariable', @floatVariable AS '@floatVariable';
Die einfache Antwort auf Ihre Frage ist, dass die beiden Zahlen nicht gleich sind. Der mit Schwimmer (53) ist genauer.
Das Berechnen der ABS der Differenz der zwei Zahlen und dann das Vergleichen mit einer akzeptablen Schwelle ist eine Möglichkeit, dies zu tun. Dies wäre jedoch nicht zufriedenstellend, wenn der Maßstab stark variieren könnte.
Um zu zeigen, warum dies nicht zufriedenstellend sein könnte:
r = 0.00
f = 0.00
den Unterschied zu einer Schwelle von 0,0005 wäre nicht sinnvoll sein Vergleich.
Es könnte also besser sein, einen Schwellenwert zu verwenden, der ein Prozentsatz der Anzahl ist.
DECLARE @threshold AS float, @delta AS float;
SET @threshold = ABS(@floatVariable/1000000);
SET @delta = ABS(@floatVariable - CAST(@realVariable AS float));
SELECT @realVariable AS '@realVariable',
@floatVariable AS '@floatVariable',
@threshold AS '@threshold',
@delta AS '@delta',
CASE
WHEN @delta < @threshold THEN N'OK'
ELSE N'Different'
END AS 'Comparison';
Hinweis: Diese Lösung könnte ein wenig Anpassung für Zahlen müssen, die sehr nahe bei Null sind.
'SELECT CAST (CAST (152304.11999512 ALS REAL) ALS FLOAT) ALS DEZIMAL (15,4))'? –
Obwohl ich nicht sicher bin, warum Sie ein weniger genaues Ergebnis wollen. –