MySql не принимает C# float.MinValue в столбце float

У меня есть приложение, которое использует NHibernate для обработки функций базы данных. Теперь у меня есть таблица со столбцом, отображаемым как float. NHibernate создал таблицу в базе данных MySql, и я также проверил столбец как "FLOAT". ПРИМЕЧАНИЕ. В столбце не определена точность FLOAT(M<, D), это просто "FLOAT".

Оператор создания таблицы частичного SQL:

CREATE TABLE `X` (
    `TresholdLow` float NOT NULL,

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

Но когда я пытаюсь вставить модель домена со свойством, установленным на float.MinValue в результате чего значение 3.40282347E+38 я получаю следующую ошибку:

ERROR 1264: Out of range value for column 'TresholdLow' at row 1

Я думаю, что это может быть связано со следующим. Это ввод (помеченный?) И вывод непосредственного окна в Visual Studio:

?float.MinValue.ToString();
"-3.402823E+38"
?float.MinValue
-3.40282347E+38

Первое значение принимается MySQL, последнее НЕ!!

Как мне обойти эту проблему? Практически это не будет проблемой, но теоретически не очень хорошо иметь столбец с плавающей запятой базы данных, не принимающий все возможные значения с плавающей запятой, поступающие из приложения, которое хранит данные.

1 ответ

Решение

Так как вы сообщаете, что -3.402823E+38 принято но -3.40282347E+38 Нет, я полагаю, что проблема в том, что некоторые программы неправильно округляются.

Наименьшее конечное 32-разрядное двоичное значение IEEE-754 с плавающей запятой не равно –3.40282347E+38, поскольку это приблизительное значение. Точное значение –340282346638528859811704183484516925440, что немного меньше по величине. Для краткости я буду использовать M для –340282346638528859811704183484516925440.

–3.40282347E + 38 находится между двумя представимыми значениями M и –infinity. Согласно правилам IEEE-754 для округления до ближайшего значения, оно должно быть округлено до M, если оно ближе к M, чем к следующему значению, которое будет продолжать конечный шаблон вместо перехода к бесконечности. Поскольку -3.40282347E + 38 ближе к М, чем к следующему числу, результат должен быть М.

Однако люди не всегда пишут программное обеспечение, которое округляется правильно. Возможно, что некоторые программы отмечают, что -3.40282347E + 38 превышает M по величине и возвращает -infinity или ошибку диапазона вместо правильного округления.

Чтобы обойти проблему, я предлагаю попробовать -3.402823466E+38, Это меньше, чем М по величине, но достаточно близко, чтобы оно могло округляться до точно М.

Другие вопросы по тегам