Почему SQL-float отличается от С# float

Howdy, у меня DataRow вытащен из DataTable из DataSet. Я обращаюсь к столбцу, который определен в SQL как тип данных с плавающей точкой. Я пытаюсь присвоить это значение локальной переменной (С# float datatype), но я получаю InvalidCastExecption

DataRow exercise = _exerciseDataSet.Exercise.FindByExerciseID(65);
_AccelLimit = (float)exercise["DefaultAccelLimit"];  

Теперь, играя с этим, я действительно заставлял его работать, но это не имело никакого смысла, и он не чувствовал себя хорошо.

_AccelLimit = (float)(double)exercise["DefaultAccelLimit"];

Кто-нибудь может объяснить, чего я здесь не вижу?

Ответ 3

Поплавок в Microsoft SQL Server эквивалентен Double in С#. Причиной этого является то, что число с плавающей запятой может приближать только десятичное число, число точность числа с плавающей запятой определяет, насколько точно число приближается к десятичному числу. Тип Double представляет собой 64-битное число с плавающей запятой двойной точности со значениями от минус 1.79769313486232e308 до положительного 1.79769313486232e308, а также положительным или отрицательным нулем, PositiveInfinity, NegativeInfinity и Not-a-Number (NaN).

Ответ 4

И обычно вы никогда не захотите использовать float в SQL Server (или реальном), если вы планируете выполнять математические вычисления на данных, поскольку это неточный тип данных, и это приведет к ошибкам расчета. Вместо этого используйте десятичный тип данных, если вам нужна точность.

Ответ 5

Я думаю, что здесь был задан главный вопрос, но я вынужден добавить что-то для раздела вопроса, в котором говорится, что это работает.

_AccelLimit = (float) (двойное) упражнение [ "DefaultAccelLimit" ];

Причина, по которой это "работает", и причина, по которой она "не нравится", заключается в том, что вы понижаете двойную поправку до второго акта (слева), чтобы вы теряли точность и эффективно сообщали компилятор, чтобы было нормально урезать возвращаемое значение.

В словах эта строка утверждает... Возьмите объект (в этом случае в этом случае будет двойной) Переместите объект в double (потеряв все обертывания объекта) Вставьте двойное в float (теряя всю точную точность двойного)

например. Если значение указано 0,0124022806089461 и вы делаете это выше, тогда значение AccelLimit будет 0.01240228

поскольку это та степень, в которой плавающий элемент С# может получить из двойного значения. Это опасная вещь, и я уверен, что ее усечение слишком, а не округление, но кто-то может подтвердить это, поскольку я не уверен.

Ответ 6

Причина, по которой он "не чувствует себя хорошо", заключается в том, что С# использует тот же синтаксис для распаковки и для кастинга, которые представляют собой две разные вещи. exercise["DefaultAccelLimit"] содержит двойное значение, помещенное в виде объекта. (double) требуется вернуть объект обратно в двойное. Перед тем, как (float), он переводит значение double в значение float. С# не разрешает бокс и литье в одной и той же операции, поэтому вам нужно распаковать, затем выполнить бросок.

То же самое верно, даже если бросок является неразрушающим. Если float был помещен как объект, который вы хотели бы перевести в двойник, вы сделали бы это так: (double)(float)object_var.