Pourquoi un float SQL différents à partir d'un C# flotteur
Bonjour, j'ai un DataRow sorti d'une Table de données à partir d'un DataSet. Je suis de l'accès à une colonne définie dans SQL comme un flotteur de type de données. Je suis en train d'affecter cette valeur à une variable locale (c# flotteur de type de données), mais je reçois un InvalidCastExecption
DataRow exercise = _exerciseDataSet.Exercise.FindByExerciseID(65);
_AccelLimit = (float)exercise["DefaultAccelLimit"];
Maintenant, en jouant avec ce que j'ai fait ce travail, mais il n'a pas de sens et il ne se sent pas bien.
_AccelLimit = (float)(double)exercise["DefaultAccelLimit"];
Quelqu'un peut-il expliquer ce que je suis en manque ici?
Vous devez vous connecter pour publier un commentaire.
Un float SQL est un double selon la documentation pour SQLDbType.
Un flotteur dans le SQL est un Double dans le CLR (C#/VB). Il y a un tableau de types de données SQL avec le CLR équivalents de sur MSDN.
Et, normalement, vous ne voulez pas utiliser flotter dans SQL Server (ou réel) si vous prévoyez d'effectuer des calculs mathématiques sur les données comme il est un type de données inexactes et il va introduire des erreurs de calcul. Utiliser un type de données décimal au lieu de cela, si vous avez besoin de précision.
Le flotteur dans Microsoft SQL Server est équivalent à un Double en C#. La raison pour cela est que d'un nombre à virgule flottante ne peut se rapprocher d'un nombre décimal, la précision d'un nombre à virgule flottante détermine avec précision le nombre se rapproche de un nombre décimal. Le Double type représente un double précision 64-bit nombre à virgule flottante avec des valeurs allant de négatif 1.79769313486232e308 pour positif 1.79769313486232e308, positif ou négatif, zéro, PositiveInfinity, NegativeInfinity, et non Pas un Nombre (NaN).
Je pense que la principale question a été posée ici, mais je me sens obligé d'ajouter quelque chose pour la section de la question que les états qui cela fonctionne.
La raison de ce qui "fonctionne" et la raison pour laquelle il "ne se sent pas bien", c'est que vous êtes le déclassement le double pour un float par la deuxième distribution (celle de gauche) donc, vous êtes en perdre la précision et efficace de dire au compilateur que c'est ok pour tronquer la valeur retournée.
Dans les mots de cette ligne-unis...
Obtenir un objet (qui arrive à tenir un double dans ce cas)
Convertir l'objet en double (de perdre tout l'objet d'habillage)
Fonte le double à un flotteur (perdre toute la précision d'un double)
par exemple, Si la valeur est dire
0.0124022806089461
et vous, vous faites le au-dessus de la valeur de AccelLimit sera
0.01240228
que c'est la mesure de ce qu'est un float en c# peut obtenir à partir de la valeur de type double.
Son une chose dangereuse à faire et je suis assez sûr que c'est un troncature trop plutôt que d'un arrondissement mais quelqu'un peut vouloir confirmer ce que je ne suis pas sûr.
La raison pour laquelle il "ne se sent pas le droit" est parce que le C# utilise la même syntaxe pour unboxing et pour casting, qui sont deux choses très différentes.
exercise["DefaultAccelLimit"]
contient une valeur de type double, boîte comme un objet.(double)
est nécessaire pour unbox l'objet d'une double. Le(float)
en face de cela, alors jette le double pour une valeur flottante. C# ne permet pas de la boxe et de la coulée dans la même opération, de sorte que vous devez unbox, puis jeté.Le même est vrai même si le casting est non destructif. Si un flotteur était en boîte comme un objet que vous avez voulu jeter en un double, vous serait-il faire comme si:
(double)(float)object_var
.