387 Stimmen

Was stellt ein Double in Sql Server dar?

Ich habe eine Reihe von Immobilien in C# die sind double und ich möchte diese in einer Tabelle in SQL Server speichern, aber ich habe festgestellt, dass es keine double Typ, was also am besten zu verwenden ist, decimal o float ?

Darin werden Werte für Breiten- und Längengrade gespeichert, weshalb ich eine möglichst hohe Genauigkeit benötige.

Vielen Dank für die bisherigen Antworten.

0 Stimmen

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

0 Stimmen

Es gibt eine großartiger Thread auf MSDN der den Hauptunterschied zwischen FLOAT und DECIMAL beschreibt. Kurz gesagt, Float ist ein Näherungswert und kann einige Werte nicht darstellen. Sehen Sie sich die akzeptierte Antwort an.

451voto

richardtallent Punkte 33425
float

Oder wenn Sie es ganz altmodisch mögen:

real

Sie können auch float(53) verwenden, aber das bedeutet das Gleiche wie float.

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

El dezimal(x,y) Der Typ SQL Server ist dafür gedacht, wenn Sie genau Dezimalzahlen anstelle von Fließkommazahlen (die Näherungswerte sein können). Dies steht im Gegensatz zum C#-Datentyp "decimal", der eher einer 128-Bit-Gleitkommazahl entspricht.

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

Um die Dinge noch verwirrender zu machen, ist ein "Float" in C# nur 32-Bit, so dass es in SQL eher dem Typ real/float(24) in MSSQL als float/float(53) entsprechen würde.

In Ihrem speziellen Anwendungsfall... Sie benötigen lediglich 5 Nachkommastellen, um den Breiten- und Längengrad mit einer Genauigkeit von etwa einem Meter darzustellen, und nur bis zu drei Stellen vor dem Komma für die Gradangaben. Float(24) oder decimal(8,5) wird Ihren Bedürfnissen in MSSQL am besten gerecht, und die Verwendung von float in C# ist gut genug, Sie brauchen double nicht. Ihre Benutzer werden es Ihnen wahrscheinlich sogar danken, dass Sie auf 5 Dezimalstellen gerundet haben, anstatt einen Haufen unbedeutender Ziffern mitzunehmen.

2 Stimmen

Sie sagen Float, David sagt Decimal, jetzt bin ich noch verwirrter :)

0 Stimmen

Ich bin mit Doubles in c# und diese Werte werden Breitengrad und Längengrad Werte in ihren jeweiligen Spalten sein.

3 Stimmen

Ich muss zustimmen und zugeben, dass ich mich geirrt habe. Ich lernte das Dezimalsystem in der IBM DB2-Welt kennen, wo das Dezimalsystem ein echter Datentyp ist, der von allen Arten von Code und der Datenbank auf IBM-Plattformen unterstützt wird. Nicht, dass es in der MS-Welt kein echter Datentyp wäre, aber er wird nicht so gut unterstützt wie in der IBM-Welt. Entschuldigung für die Verwirrung, die ich gestiftet habe.

86voto

Mazdak Shojaie Punkte 1506

También, aquí ist eine gute Antwort für SQL-CLR Type Mapping mit einer nützlichen Tabelle.

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

1 Stimmen

Der folgende Link ist ebenfalls von Nutzen; er enthält zusätzliche Informationen zu den oben genannten, da er die SqlDataReader-Prozeduren und -Aufzählungen zeigt (zusätzlich zu den .NET- und SQL-Typvergleichen) docs.microsoft.com/de-us/dotnet/framework/data/adonet/

16voto

gbn Punkte 407102

Float ist das nächstliegende Äquivalent.

SqlDbType Aufzählung

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

Ein Meter entspricht 1/40.000.000 des Breitengrades, 1 Sekunde entspricht etwa 30 Metern. Mit Float/Double erhält man 15 signifikante Stellen. Mit etwas schnellem und zweifelhaftem Kopfrechnen... wären die Rundungs- und Näherungsfehler etwa so groß wie die Länge dieses Füllstrichs -> "."

1 Stimmen

Verkaufen Sie Ihre Bildschirmtechnologie an Apple und verdienen Sie Milliarden! (Schnelles Rechnen sagt mir, dass Sie die extremste Auflösung haben, von der ich je gehört habe, sogar in Breitengraden nahe dem Nord-/Südpol; etwa eine Milliarde Mal höher als meine).

10voto

RichardOD Punkte 28349

Sie sollten es auf FLOAT(53) abbilden - das ist es, was LINQ to SQL macht .

9voto

Euro Micelli Punkte 32040

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 sind die Bits der Mantisse.

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

2 Stimmen

Eigentlich, IIRC, verwendet double in .NET eine 52-Bit-Mantisse und einen 11-Bit-Exponenten.

0 Stimmen

Ich werde verflucht sein; du hast Recht! Ich frage mich, was SQL mit dem zusätzlichen Bit macht; es wird nicht für den Exponenten verwendet. Wenn es das täte, würde der Exponent auf +-616 statt auf +-308 steigen. Vielleicht um NULL zu verfolgen?

0 Stimmen

Jetzt bin ich verwirrt. Alles deutet darauf hin, dass sie das gleiche Format verwenden (wie alles andere in Windows). Und warum sollten sie das nicht tun? Ich kann keine eindeutige Aussage über die bitweise Darstellung in SQL Server finden (außer auf der Hilfeseite für float). Ich werde eine Korrektur veröffentlichen, wenn ich etwas herausfinde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X