it-swarm.com.de

Was ist ein Double in SQL Server?

Ich habe ein paar Eigenschaften in C#, die double sind, und ich möchte diese in einer Tabelle in SQL Server speichern. Ich habe jedoch festgestellt, dass es keinen double-Typ gibt. Was sollte also am besten verwendet werden: decimal oder float?

Dadurch werden Breiten- und Längenwerte gespeichert, daher brauche ich die genaueste Genauigkeit.

Danke für die bisherigen Antworten.

289
Xaisoft
float

Oder wenn Sie zur alten Schule gehen wollen:

real

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

("real" ist gleichbedeutend mit float (24), nicht float/float (53).)

Der decimal (x, y) SQL Server-Typ gibt an, wann Sie exact Dezimalzahlen anstelle von Gleitkommazahlen verwenden möchten (dies können Näherungen sein). Dies steht im Gegensatz zum Datentyp C # "decimal", der eher einer 128-Bit-Gleitkommazahl entspricht.

MSSQL float hat nicht genau die gleiche Genauigkeit wie der 64-Bit double - Typ in .NET (geringfügiger Unterschied in der Mantissen-IIRC), aber für die meisten Anwendungen ist dies eine sehr ähnliche Übereinstimmung.

Um das Ganze noch verwirrender zu machen, ist ein "Float" in C # nur 32-Bit, sodass es in SQL dem re/float (24) -Typ in MSSQL mehr entspricht als float/float (53).

In Ihrem speziellen Anwendungsfall ... Alles, was Sie brauchen, ist 5 Stellen nach dem Dezimalpunkt, um Breitengrad und Längengrad mit einer Genauigkeit von etwa einem Meter darzustellen, und Sie benötigen nur bis zu drei Stellen vor dem Dezimalpunkt die grad Float (24) oder Dezimal (8,5) passen am besten zu Ihren Anforderungen in MSSQL. Die Verwendung von Float in C # ist gut genug. Sie brauchen nicht doppelt. In der Tat werden sich Ihre Benutzer wahrscheinlich dafür bedanken, dass Sie auf fünf Dezimalstellen gerundet wurden und nicht nur ein paar unbedeutende Ziffern auf der Fahrt dabei sind.

344
richardtallent

Hier sind die CLR-Datentypzuordnungen zu SQL Server: http://msdn.Microsoft.com/en-us/library/system.data.sqldbtype.aspx

47
Achilles

here ist auch eine gute Antwort für SQL-CLR-Typmapping mit einem nützlichen Diagramm.

Von diesem Beitrag (von David ): enter image description here

37
Mazdak Shojaie

float ist das nächste Äquivalent.

SqlDbType-Aufzählung

Bearbeiten: 

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

Ein Meter entspricht 1/40.000.000 der geographischen Breite, 1 Sekunde etwa 30 Meter. Float/Double geben Ihnen 15 signifikante Zahlen. Bei etwas schneller und zwielichtiger mentaler Arithmetik ... wären die Rundungs-/Näherungsfehler ungefähr die Länge dieses Füllstopps -> "."

14
gbn

Wie die meisten anderen bemerkt haben, ist float die richtige Antwort. Weitere Informationen finden Sie in der Microsoft-Dokumentation zu SQL Server - Zuordnung von CLR-Datentypen .

14

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

9
RichardOD

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

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

.NET double verwendet 54 Bits für die Mantisse.

7
Euro Micelli

Für SQL Server:

Der Dezimaltyp ist eine 128-Bit-Vorzeichennummer Float ist eine 64-Bit-Vorzeichennummer.

Die eigentliche Antwort lautet Float. Ich war falsch bezüglich der Dezimalzahl.

Wenn Sie eine Dezimalzahl verwenden, werden Sie niemals 64 Bit des Dezimaltyps füllen.

Decimal gibt zwar keinen Fehler aus, wenn Sie versuchen, einen Int-Typ zu verwenden.

Hier ist ein Nizza Referenzdiagramm der Typen.

5
David Basarab

Es gibt ein großer Thread auf MSDN , das den Hauptunterschied zwischen FLOAT und DECIMAL beschreibt. Float ist kurz gesagt und kann einige Werte nicht darstellen.

Schauen Sie sich die akzeptierte Antwort an.

5
Matthew Jones

@Achilles Ausgezeichnet! Kam hier für den doppelten Aufenthalt für die TinyInt.

Hier ist ein teilweise abgeschlossener Schalterfall zum Konvertieren zwischen dataTable und SQL: 

switch (columnDataTypeList[i])
{
    case "System.String":
        columnDataTypeList[i] = "VARCHAR(MAX)";
        break;
    case "System.Int32":
        columnDataTypeList[i] = "INT";
        break;
    case "System.DateTime":
        columnDataTypeList[i] = "DATE";
        break;
    case "System.Double":
        columnDataTypeList[i] = "FLOAT";
        break;
}

Die Zeichenfolge kann ein Problem sein. Stellen Sie sicher, dass Sie sie an Ihre Bedürfnisse anpassen, aber das Doppelte sollte funktionieren. 

3
JPK

Es klingt wie Sie auswählen können. Wenn Sie Schwimmer wählen, können Sie 11 Stellen Genauigkeit verlieren. Wenn das akzeptabel ist, dann gehen Sie davon aus - offenbar hielten es die Linq-Designer für einen guten Kompromiss.

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

2
DaveN59

Gibt es nicht bereits Zuordnungen in den System.Data.Sql-Klassen?

Siehe: C #: Entsprechungen für SQL Server-Datentypen in .NET Framework .

Mache jetzt einen Schwimmer ...

1
Dan Diplo

Falls dies von Nutzen ist, verweise ich auf den Link, auf den ich mich normalerweise beziehe (ich landete dieses Mal in einem ersten Google auf diesem Thread!). 

Es enthält zusätzliche Informationen zu den vorherigen Links, da es die SqlDataReader-Prozeduren und -Eumerationen zeigt (zusätzlich zu den Vergleichen von .NET und SQL).

https://docs.Microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings

(und ja schweben!)

0
d219