J'ai quelques propriétés dans C#
lesquelles se trouvent double
et je souhaite les stocker dans une table dans SQL Server, mais j'ai remarqué qu'il n'y a pas de double
type, alors quelle est la meilleure à utiliser, decimal
ou float
?
Cela stockera les valeurs de latitude et de longitude, j'ai donc besoin de la précision la plus précise.
Merci pour les réponses jusqu'à présent.
c#
sql
sql-server
sql-server-2005
tsql
Xaisoft
la source
la source
Réponses:
Ou si vous voulez aller à la vieille école:
Vous pouvez également utiliser float (53), mais cela signifie la même chose que float.
("réel" est équivalent à float (24), pas à float / float (53).)
Le type SQL Server décimal (x, y) est pour quand vous voulez des nombres décimaux exacts plutôt que des virgules flottantes (qui peuvent être des approximations). Cela contraste avec le type de données "décimal" C #, qui ressemble plus à un nombre à virgule flottante de 128 bits.
Le type float de MSSQL est équivalent au type double 64 bits dans .NET. (Ma réponse originale de 2011 indiquait qu'il pourrait y avoir une légère différence dans la mantisse, mais je l'ai testée en 2020 et ils semblent être 100% compatibles dans leur représentation binaire des très petits et très grands nombres - voir https: / /dotnetfiddle.net/wLX5Ox pour mon test).
Pour rendre les choses plus confuses, un "float" en C # n'est que de 32 bits, il serait donc plus équivalent en SQL au type real / float (24) dans MSSQL que float / float (53).
Dans votre cas d'utilisation spécifique ... Tout ce dont vous avez besoin est de 5 positions 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 le point décimal pour les degrés. Float (24) ou décimal (8,5) correspondra le mieux à vos besoins en MSSQL, et l'utilisation de float en C # est assez bonne, vous n'avez pas besoin de doubler. En fait, vos utilisateurs vous remercieront probablement d'avoir arrondi à 5 décimales plutôt que d'avoir un tas de chiffres insignifiants à venir pour le trajet.
la source
En outre, voici une bonne réponse pour le mappage de type SQL-CLR avec un graphique utile.
De ce poste (par David ):
la source
float est l'équivalent le plus proche.
Énumération SqlDbType
Pour Lat / Long comme OP mentionné.
Un mètre correspond à 1/40 000 000 de latitude, 1 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 de la longueur de cet arrêt de remplissage -> "."
la source
Vous devez le mapper sur FLOAT (53) - c'est ce que fait LINQ to SQL .
la source
float
dans SQL Server a en fait [modifier: presque] la précision d'un "double" (dans un sens C #).float
est synonyme defloat(53)
. 53 est les morceaux de la mantisse..NET
double
utilise 54 bits pour la mantisse.la source
Pour SQL Sever:
Le type décimal est un numéro signé sur 128 bits. Le flottant est un numéro signé sur 64 bits.
La vraie réponse est Float , j'avais tort sur la décimale.
La raison est que si vous utilisez une décimale, vous ne remplirez jamais 64 bits de type décimal.
Bien que décimal ne vous donnera pas d'erreur si vous essayez d'utiliser un type int.
Voici un joli tableau de référence des types.
la source
Il semble que vous puissiez choisir. Si vous choisissez float, vous risquez de perdre 11 chiffres de précision. Si c'est acceptable, allez-y - apparemment, les concepteurs de Linq ont pensé 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 de toute façon beaucoup plus précis qu'un flottant - pas de traduction désordonnée de la base 10 à la base 2 et inversement.
la source
A
Float
représentedouble
dans le serveur SQL. Vous pouvez trouver une preuve du codage en C # dans Visual Studio. Ici, je l'ai déclaré enOvertime
tant queFloat
serveur SQL et en C #. Ainsi je suis capable de convertirIci
OverTime
est déclaréfloat type
la source