Ich habe einige Eigenschaften, in C#
denen sich diese befinden, double
und ich möchte diese in einer Tabelle in SQL Server speichern, habe jedoch festgestellt, dass es keinen double
Typ gibt. Was ist also am besten zu verwenden, decimal
oder float
?
Dadurch werden Breiten- und Längengrade gespeichert, daher benötige ich die genaueste Genauigkeit.
Vielen Dank für die bisherigen Antworten.
c#
sql
sql-server
sql-server-2005
tsql
Xaisoft
quelle
quelle
Antworten:
Oder wenn Sie auf die alte Schule gehen wollen:
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.
quelle
Auch hier ist eine gute Antwort für SQL-CLR Typzuordnung mit einem nützlichen Diagramm.
Aus diesem Beitrag (von David ):
quelle
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 -> "."
quelle
Sie sollten es FLOAT (53) zuordnen - genau das macht LINQ to SQL .
quelle
float
in SQL Server hat tatsächlich [Bearbeiten: fast] die Genauigkeit eines "Double" (im C # -Sinne).float
ist ein Synonym fürfloat(53)
. 53 sind die Bits der Mantisse..NET
double
verwendet 54 Bit für die Mantisse.quelle
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.
quelle
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.
quelle
A
Float
stehtdouble
in SQL Server. Sie finden einen Beweis aus der Codierung in C # in Visual Studio. Hier habe ichOvertime
alsFloat
in SQL Server und in C # deklariert . So kann ich konvertierenHier
OverTime
wird deklariertfloat type
quelle