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
, Это меньше, чем М по величине, но достаточно близко, чтобы оно могло округляться до точно М.