web-dev-qa-db-fra.com

Que représente un serveur double en SQL?

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, quel est donc le meilleur moyen d'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.

289
Xaisoft
float

Ou si vous voulez aller à la vieille école:

real

Vous pouvez également utiliser float (53), mais cela signifie la même chose que float.

("real" est équivalent à float (24), pas float/float (53).)

Le type décimal (x, y) SQL Server est utilisé lorsque vous voulez exact nombres décimaux plutôt que des nombres à virgule flottante (qui peuvent être des approximations). Cela contraste avec le type de données "décimal" C #, qui ressemble davantage à un nombre à virgule flottante de 128 bits.

MSSQL float n'a pas exactement la même précision que le type 64 bits double dans .NET (légère différence dans la mantisse IIRC), mais il correspond suffisamment à la plupart des utilisations .

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

Dans votre cas d'utilisation spécifique ... Tout ce dont vous avez besoin est de 5 places après le point décimal pour représenter la latitude et la longitude avec une précision d'environ un mètre, et vous n'avez besoin que de trois chiffres avant la virgule pour les degrés. Flottant (24) ou décimal (8,5) conviendra le mieux à vos besoins dans MSSQL, et utiliser float en C # suffit, vous n'avez pas besoin du double. En fait, vos utilisateurs vous remercieront probablement d’avoir arrondi à 5 décimales au lieu d’avoir un tas de chiffres insignifiants pour le trajet.

344
richardtallent

Voici les mappages de types de données CLR sur SQL Server: http://msdn.Microsoft.com/en-us/library/system.data.sqldbtype.aspx

47
Achilles

En outre, ici est une bonne réponse pour le mappage de types SQL-CLR avec un graphique utile.

De ce message (de David ): enter image description here

37
Mazdak Shojaie

float est l'équivalent le plus proche.

SqlDbType, énumération

Modifier: 

Pour Lat/Long comme OP mentionné.

Un mètre équivaut à 1/40 000 000 de la latitude, une seconde à environ 30 mètres. Float/double vous donne 15 chiffres significatifs. Avec une arithmétique mentale rapide et douteuse ... les erreurs d'arrondi/approximation seraient la longueur de cet arrêt de remplissage -> "."

14
gbn

Comme la plupart des autres l'ont noté, float est la bonne réponse. Voir Documentation de Microsoft sur SQL Server - Mappage de types de données CLR pour plus d'informations.

14
Michael Petrotta

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

9
RichardOD

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

float est un synonyme de float(53). 53 sont les morceaux de la mantisse.

.NET double utilise 54 bits pour la mantisse.

7
Euro Micelli

Pour SQL Server:

Le type décimal est un nombre signé de 128 bits Float est un nombre signé de 64 bits.

La vraie réponse est Float, je me suis trompé de décimal.

La raison en 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 d'erreur si vous essayez d'utiliser un type int.

Ici est un tableau de référence de Nice des types.

5
David Basarab

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

Regardez la réponse acceptée.

5
Matthew Jones

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

Voici un cas de commutation partiellement terminé à 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 la modifier selon vos besoins, mais le double devrait fonctionner, ce qui est la question à résoudre. 

3
JPK

On dirait que vous pouvez choisir. Si vous choisissez float, vous risquez de perdre 11 chiffres de précision. Si c'est acceptable, foncez - apparemment, les concepteurs de Linq ont pensé que c'était un bon compromis.

Toutefois, si votre application a besoin de ces chiffres supplémentaires, utilisez décimal. Décimal (mis en œuvre correctement) est de toute façon plus précis qu’un float - pas de traduction en désordre de la base 10 à la base 2 et inversement.

2
DaveN59

N'y a-t-il pas déjà des mappages dans les classes System.Data.Sql?

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

Maintenant, fais de moi un flotteur ...

1
Dan Diplo

Au cas où cela serait utile, le lien ci-dessous est celui auquel je me réfère habituellement (je me suis retrouvé sur ce fil lors d’un premier Google cette fois!). 

Il contient des informations supplémentaires par rapport aux liens précédents publiés, car il affiche les procédures et énumérations SqlDataReader (en plus des comparaisons de types .NET et SQL).

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

(et oui float!)

0
d219