Qu'est-ce qui représente un double en sql server?

j'ai quelques propriétés dans C# qui sont double et je veux les stocker dans une table dans SQL Server, mais j'ai remarqué qu'il n'y a pas de type double , alors qu'est-ce qu'il y a de mieux à utiliser, decimal ou float ?

cela va stocker les valeurs de latitude et de longitude, donc j'ai besoin de la précision la plus précise.

Merci pour les réponses jusqu'à présent.

283
demandé sur sll 2009-07-31 00:34:03

14 réponses

float

ou si vous voulez aller à la vieille école:

real

vous pouvez aussi utiliser float(53), mais cela signifie la même chose que float.

("réel" est équivalent à flotteur(24), pas de flotteur/float(53).)

le type de serveur décimal(x,y) SQL est pour quand vous voulez nombres décimaux" exacts plutôt que des points flottants (qui peuvent être des approximations). Ceci est en contraste à l' C # type de données" décimal", qui est plus comme un nombre de point flottant de 128 bits.

MSSQL float n'a pas de exactement la même précision que le 64 bits double "1519100920 de type".NET (légère différence dans la mantisse IIRC), mais c'est assez proche de match pour la plupart des utilisations.

pour rendre les choses plus confuses, un "float" en C# n'est que de 32 bits, donc il serait plus équivalent en SQL réel/float(24) type de MSSQL que float/float(53).

dans votre cas d'utilisation spécifique... Tout ce que vous avez besoin est 5 places après le point décimal pour représenter la latitude et la longitude à l'intérieur d'environ un mètre de précision, et vous n'avez besoin que de trois chiffres avant le point décimal pour les degrés. Float (24) ou decimal(8,5) s'adaptera le mieux à vos besoins en MSSQL, et utiliser float en C# est assez bon, vous n'avez pas besoin de double. En fait, vos utilisateurs vous remercieront probablement pour arrondir à 5 décimales plutôt que d'avoir un tas de chiffres insignifiants venant le long pour le tour.

338
répondu richardtallent 2018-03-29 16:48:44

Voici les correspondances de type de données CLR vers SQL Server: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx

46
répondu Achilles 2009-07-30 20:45:31

aussi, ici est une bonne réponse pour la cartographie de type SQL-CLR avec une carte utile.

à Partir de ce poste (par David ): enter image description here

29
répondu Mazdak Shojaie 2017-05-23 12:02:56

comme la plupart des autres l'ont fait remarquer, float est la bonne réponse. Voir documentation de Microsoft sur SQL Server-CLR DataType mapping pour plus d'informations.

14
répondu Michael Petrotta 2009-07-30 20:41:02
Le flotteur

est l'équivalent le plus proche.

SqlDbType Énumération

Edit:

Pour Lat/Long que l'OP mentionné.

un mètre représente 1/40 000 000 de latitude,1 seconde représente environ 30 mètres. Float / double vous donne 15 chiffres significatifs. Avec un calcul mental rapide et douteux... les erreurs d'arrondi/approximation seraient d'environ la longueur de ce fill stop -> "."

14
répondu gbn 2009-07-30 21:06:46

vous devriez le mapper à FLOAT(53)- c'est ce que LINQ à SQL fait .

9
répondu RichardOD 2009-07-30 20:37:17

float dans SQL Server a en fait [edit:almost] la précision d'un "double" (dans un sens C#).

float est un synonyme de float(53) . 53 c'est les bouts de la mantissa.

.NET double utilise 54 bits pour le mantissa.

7
répondu Euro Micelli 2009-07-30 21:36:17

Il y a un grand fil sur MSDN décrivant la principale différence entre le FLOTTEUR et le DÉCIMAL. En bref, Float est approximatif et ne peut pas représenter certaines valeurs.

regardez la réponse acceptée.

5
répondu Matthew Jones 2009-07-30 20:39:20

pour SQL Sever:

de Type Decimal est de 128 bits signé nombre Float est un numéro signé 64 bits.

la vraie réponse est Float , j'étais incorrect au sujet de décimal.

la raison est que si vous utilisez une décimale, vous ne remplirez jamais 64 bits du type décimal.

bien que décimal ne vous donnera pas une erreur si vous essayez d'utiliser un type int.

ici est une belle carte de référence des types.

5
répondu David Basarab 2009-07-30 20:44:54

@Achilles Excellent! Je suis venu ici pour le double séjour pour le TinyInt.

voici un cas de commutateur partiellement fait pour convertir entre dataTable et 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;
}

la chaîne peut être un problème assurez-vous de l'éditer à vos besoins, mais le double devrait fonctionner qui est la question à la main.

3
répondu JPK 2016-10-19 09:43:31

on dirait que tu peux choisir. Si vous choisissez flotteur, vous pouvez perdre 11 chiffres de précision. Si c'est acceptable, allez-y -- apparemment Linq concepteurs pensais que c'était un bon compromis.

cependant, si votre application a besoin de ces chiffres supplémentaires, utilisez décimal. Décimal (implémenté correctement) est beaucoup plus précis qu'un float de toute façon -- pas de translation désordonnée de la base 10 à la base 2 et retour.

2
répondu DaveN59 2009-07-30 20:42:28

N'y a-t-il pas déjà des correspondances dans le système?Données.Sql classes?

Voir: C#: types de données SQL Server équivalents .NET Framework .

maintenant, Faites du mien un char...

1
répondu Dan Diplo 2009-07-30 20:40:16

dans le cas où cela est d'usage, le lien ci-dessous est habituellement auquel je me réfère (j'ai fini sur ce fil sur un premier Google cette fois!).

il a des informations supplémentaires aux liens précédents affichés, car il montre les procédures SqlDataReader et les énumérations (en plus des comparaisons de type .NET et SQL)

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

(et oui float!)

0
répondu d219 2018-02-08 15:19:07

Float représente le double de SQL server . Vous pouvez trouver une preuve du codage dans C# dans visual studio. J'ai déclaré ici les heures supplémentaires comme Float dans S QL server et dans C# . Ainsi je suis capable de convertir

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

ici heures supplémentaires est déclaré float type

-2
répondu Md Shoriful Islam 2018-04-28 22:07:10