Ответ 1
SQL-float является двойным в соответствии с документацией для SQLDbType.
Howdy, у меня DataRow вытащен из DataTable из DataSet. Я обращаюсь к столбцу, который определен в SQL как тип данных с плавающей точкой. Я пытаюсь присвоить это значение локальной переменной (С# float datatype), но я получаю InvalidCastExecption
DataRow exercise = _exerciseDataSet.Exercise.FindByExerciseID(65);
_AccelLimit = (float)exercise["DefaultAccelLimit"];
Теперь, играя с этим, я действительно заставлял его работать, но это не имело никакого смысла, и он не чувствовал себя хорошо.
_AccelLimit = (float)(double)exercise["DefaultAccelLimit"];
Кто-нибудь может объяснить, чего я здесь не вижу?
SQL-float является двойным в соответствии с документацией для SQLDbType.
Поплавок в SQL - это Double в CLR (С#/VB). Там таблица типов данных SQL с эквивалентами CLR на MSDN.
Поплавок в Microsoft SQL Server эквивалентен Double in С#. Причиной этого является то, что число с плавающей запятой может приближать только десятичное число, число точность числа с плавающей запятой определяет, насколько точно число приближается к десятичному числу. Тип Double представляет собой 64-битное число с плавающей запятой двойной точности со значениями от минус 1.79769313486232e308 до положительного 1.79769313486232e308, а также положительным или отрицательным нулем, PositiveInfinity, NegativeInfinity и Not-a-Number (NaN).
И обычно вы никогда не захотите использовать float в SQL Server (или реальном), если вы планируете выполнять математические вычисления на данных, поскольку это неточный тип данных, и это приведет к ошибкам расчета. Вместо этого используйте десятичный тип данных, если вам нужна точность.
Я думаю, что здесь был задан главный вопрос, но я вынужден добавить что-то для раздела вопроса, в котором говорится, что это работает.
_AccelLimit = (float) (двойное) упражнение [ "DefaultAccelLimit" ];
Причина, по которой это "работает", и причина, по которой она "не нравится", заключается в том, что вы понижаете двойную поправку до второго акта (слева), чтобы вы теряли точность и эффективно сообщали компилятор, чтобы было нормально урезать возвращаемое значение.
В словах эта строка утверждает... Возьмите объект (в этом случае в этом случае будет двойной) Переместите объект в double (потеряв все обертывания объекта) Вставьте двойное в float (теряя всю точную точность двойного)
например. Если значение указано 0,0124022806089461 и вы делаете это выше, тогда значение AccelLimit будет 0.01240228
поскольку это та степень, в которой плавающий элемент С# может получить из двойного значения. Это опасная вещь, и я уверен, что ее усечение слишком, а не округление, но кто-то может подтвердить это, поскольку я не уверен.
Причина, по которой он "не чувствует себя хорошо", заключается в том, что С# использует тот же синтаксис для распаковки и для кастинга, которые представляют собой две разные вещи. exercise["DefaultAccelLimit"]
содержит двойное значение, помещенное в виде объекта. (double)
требуется вернуть объект обратно в двойное. Перед тем, как (float)
, он переводит значение double в значение float. С# не разрешает бокс и литье в одной и той же операции, поэтому вам нужно распаковать, затем выполнить бросок.
То же самое верно, даже если бросок является неразрушающим. Если float был помещен как объект, который вы хотели бы перевести в двойник, вы сделали бы это так: (double)(float)object_var
.