Was ist ein Double in SQL Server?

335

Ich habe einige Eigenschaften, in C#denen sich diese befinden, doubleund ich möchte diese in einer Tabelle in SQL Server speichern, habe jedoch festgestellt, dass es keinen doubleTyp gibt. Was ist also am besten zu verwenden, decimaloder float?

Dadurch werden Breiten- und Längengrade gespeichert, daher benötige ich die genaueste Genauigkeit.

Vielen Dank für die bisherigen Antworten.

Xaisoft
quelle
Hier sind die CLR-Datentypzuordnungen zu SQL Server: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Achilles
Es gibt einen großartigen Thread zu MSDN , der den Hauptunterschied zwischen FLOAT und DECIMAL beschreibt. Kurz gesagt, Float ist ungefähr und kann einige Werte nicht darstellen. Schauen Sie sich die akzeptierte Antwort an.
Matthew Jones

Antworten:

387
float

Oder wenn Sie auf die alte Schule gehen wollen:

real

Sie können auch float (53) verwenden, dies bedeutet jedoch dasselbe wie float.

("real" entspricht float (24), nicht float / float (53).)

Der dezimale (x, y) SQL Server-Typ ist für den Fall vorgesehen, dass Sie exakte Dezimalzahlen anstelle von Gleitkommazahlen (die Näherungswerte sein können) wünschen. Dies steht im Gegensatz zum C # -Datentyp "Dezimal", der eher einer 128-Bit-Gleitkommazahl ähnelt.

Der Float- Typ von MSSQL entspricht dem 64-Bit - Doppeltyp in .NET. (Meine ursprüngliche Antwort aus dem Jahr 2011 besagte, dass es einen kleinen Unterschied in der Mantisse geben könnte, aber ich habe dies im Jahr 2020 getestet und sie scheinen in ihrer binären Darstellung sowohl sehr kleiner als auch sehr großer Zahlen zu 100% kompatibel zu sein - siehe https: / /dotnetfiddle.net/wLX5Ox für meinen Test).

Um die Sache noch verwirrender zu machen, ist ein "float" in C # nur 32-Bit, daher entspricht es in SQL eher dem Typ real / float (24) in MSSQL als float / float (53).

In Ihrem speziellen Anwendungsfall ... Sie benötigen lediglich 5 Stellen nach dem Dezimalpunkt, um Breiten- und Längengrade mit einer Genauigkeit von etwa einem Meter darzustellen, und Sie benötigen nur bis zu drei Stellen vor dem Dezimalpunkt für die Grade. Float (24) oder Dezimal (8,5) passen am besten zu Ihren Anforderungen in MSSQL, und die Verwendung von Float in C # ist gut genug, Sie benötigen kein Double. In der Tat werden Ihre Benutzer Ihnen wahrscheinlich dafür danken, dass Sie auf 5 Dezimalstellen gerundet haben, anstatt eine Reihe unbedeutender Ziffern für die Fahrt zu haben.

richardtallent
quelle
1
Sie sagen float, David sagt dezimal, jetzt bin ich noch verwirrter :)
Xaisoft
Ich verwende Doubles in c # und diese Werte sind Breiten- und Längengrade in ihren jeweiligen Spalten.
Xaisoft
1
Ich muss zustimmen und zugeben, dass ich nicht auf der Basis war. Ich wurde in die IBM DB2-Welt eingeführt, in der Dezimalzahl ein realer Datentyp ist, der von allen Arten von Code und der Datenbank auf IBM Plattformen unterstützt wird. Nicht, dass es sich in der MS-Welt nicht um einen echten Datentyp handelt, aber er wird nicht so gut unterstützt wie im IBM-Camp. Entschuldigen Sie die Verwirrung.
DaveN59
2
"MSSQL-Float hat nicht genau die gleiche Genauigkeit wie der 64-Bit-Doppeltyp in .NET (geringfügiger Unterschied in Mantissa IIRC), entspricht jedoch den meisten Verwendungszwecken." Haben Sie eine Referenz dafür? Soweit ich sehen kann, verwenden beide 53 Bit Signifikand, 64 Bit für die Speicherung und haben das gleiche
Bitlayout
2
Ich bin auch ziemlich neugierig auf die Frage von @codekaizen (kleiner Unterschied in der Mantisse). Haben Sie eine Referenz oder einen Test, der dies veranschaulicht?
Mads Ravn
62

Auch hier ist eine gute Antwort für SQL-CLR Typzuordnung mit einem nützlichen Diagramm.

Aus diesem Beitrag (von David ): Geben Sie hier die Bildbeschreibung ein

Mazdak Shojaie
quelle
Unter Link auch von Nutzen; Es enthält zusätzliche Informationen zu den oben genannten, da es die SqlDataReader-Prozeduren und -Aufzählungen (zusätzlich zu den .NET- und SQL- Typvergleichen
d219
15

float ist das nächste Äquivalent.

SqlDbType-Aufzählung

Für Lat / Long wie OP erwähnt.

Ein Meter ist 1 / 40.000.000 des Breitengrads, 1 Sekunde ist ungefähr 30 Meter. Float / Double gibt Ihnen 15 signifikante Zahlen. Mit etwas schneller und zwielichtiger mentaler Arithmetik ... wären die Rundungs- / Approximationsfehler ungefähr die Länge dieses Füllstopps -> "."

gbn
quelle
1
Verkaufen Sie Ihre Bildschirmtechnologie an Apple und verdienen Sie Milliarden! (Schnelle Arithmetik sagt mir, dass Sie die extremste Auflösung haben, von der ich je gehört habe, selbst in Breiten nahe dem Nord- / Südpol; ungefähr eine Milliarde Mal höher als meine.)
Jonas Byström
10

Sie sollten es FLOAT (53) zuordnen - genau das macht LINQ to SQL .

RichardOD
quelle
8

float in SQL Server hat tatsächlich [Bearbeiten: fast] die Genauigkeit eines "Double" (im C # -Sinne).

floatist ein Synonym für float(53). 53 sind die Bits der Mantisse.

.NET doubleverwendet 54 Bit für die Mantisse.

Euro Micelli
quelle
2
Tatsächlich verwendet IIRC, double in .NET, eine 52-Bit-Mantisse und einen 11-Bit-Exponenten.
richardtallent
Ich werde verdammt sein; Du hast recht! Ich frage mich, was SQL mit dem zusätzlichen Bit macht. Es wird nicht für den Exponenten verwendet. In diesem Fall würde der Exponent auf + -616 anstatt auf + -308 steigen. Vielleicht um NULL zu verfolgen?
Euro Micelli
Jetzt bin ich verwirrt. Jedes Beweisstück weist auf die Idee hin, dass sie dasselbe Format verwenden (wie alles andere in Windows). Und warum sollten sie nicht? Ich kann keine eindeutige Anweisung zur bitweisen Darstellung in SQL Server finden (außer der Hilfeseite für float). Ich werde eine Korrektur veröffentlichen, wenn ich es herausfinde.
Euro Micelli
5

Für SQL Server:

Der Dezimaltyp ist eine vorzeichenbehaftete 128-Bit-Zahl. Float ist eine vorzeichenbehaftete 64-Bit-Zahl.

Die wirkliche Antwort ist Float , ich war falsch in Bezug auf Dezimalstellen.

Der Grund ist, wenn Sie eine Dezimalstelle verwenden, werden Sie niemals 64 Bit des Dezimaltyps füllen.

Obwohl Dezimalzahl keinen Fehler ausgibt, wenn Sie versuchen, einen int-Typ zu verwenden.

Hier ist eine schöne Referenztabelle der Typen.

David Basarab
quelle
Jetzt ist es noch verwirrender mit zwei verschiedenen Antworten: p
Xaisoft
1
Sei nicht verwirrt. Diese Antwort ist falsch. Dezimal ist ein Basis-10-Typ. Float (in SQL Server und der CLR) ist ein Basis-2-Typ.
Michael Petrotta
3

Es hört sich so an, als könnten Sie auswählen. Wenn Sie float auswählen, verlieren Sie möglicherweise 11 Stellen Genauigkeit. Wenn das akzeptabel ist, machen Sie es - anscheinend hielten die Linq-Designer dies für einen guten Kompromiss.

Wenn Ihre Anwendung jedoch diese zusätzlichen Ziffern benötigt, verwenden Sie eine Dezimalstelle. Dezimal (korrekt implementiert) ist ohnehin viel genauer als ein Float - keine unordentliche Übersetzung von Basis 10 zu Basis 2 und zurück.

DaveN59
quelle
Dies dient zum Speichern von Breiten- und Längengraden. Macht das einen Unterschied?
Xaisoft
Dies ist einfach falsch ... sowohl float / float (53) in MSSQL als auch double in C # haben eine Genauigkeit von ungefähr 15 Stellen. Sie sind nicht genau gleich, aber nah genug. Decimal hingegen ist ein vollständiger Overkill für das Speichern eines Double, und es muss für alle Berechnungen in SQL Server zur Basis 2 zurückkehren und als Double zu C # zurückkehren.
richardtallent
Ich stehe korrigiert. Was Sie sagen, macht für mich vollkommen Sinn. Dezimal ist nur dann sinnvoll, wenn Sie es überall als Dezimalwert beibehalten. Sie verlieren jedes Mal an Wert, wenn Sie eine Konvertierung von Basis 10 zu Basis 2 (und zurück) vornehmen.
DaveN59
-2

A Floatsteht doublein SQL Server. Sie finden einen Beweis aus der Codierung in C # in Visual Studio. Hier habe ich Overtimeals Floatin SQL Server und in C # deklariert . So kann ich konvertieren

int diff=4;
attendance.OverTime = Convert.ToDouble(diff);

Hier OverTimewird deklariertfloat type

Md Shoriful Islam
quelle