Получение значения с плавающей запятой из базы данных - PullRequest
1 голос
/ 08 августа 2011

Я использую SQL Server, и в одной из таблиц у меня есть столбец с плавающей запятой.Когда я смотрю на это значение в Microsoft SQL Server Management Studio, в одной из записей я вижу значение 1.3.У меня также есть клиентское приложение, которое получает данные из базы данных через Entity Framework (EF), и у него есть соответствующее свойство типа null double (double?) Для этого столбца.Теперь, когда я получаю значение из базы данных, в нем содержится 1,2999999523162842 значения.

Все эти записи (более 1 миллиона) будут использоваться при интерполяции, экстраполяции и вычислении, и любое наименьшее отклонение становится значимым значением.Таким образом, все значения на стороне клиента должны соответствовать значениям в базе данных.

Я не могу округлить на стороне клиента до первого десятичного числа, потому что в базе данных есть значения с 2, 3, 4 илибольше десятичных знаков.

Мой вопрос заключается в том, как мне убедиться, что все значения в базе данных будут одинаковыми на клиенте после загрузки их из базы данных через EF?

Большое спасибо завперед.

1 Ответ

9 голосов
/ 08 августа 2011

Не является ли float двоичное значение с плавающей запятой в SQL Server?Если это так, то ваше значение не на самом деле 1,3, поскольку это не совсем представимо в двоичной с плавающей запятой.Опции:

  • Возможно, ваше поле фактически имеет тип десятичный с плавающей (или фиксированной) точкой, в этом случае вы должны использовать decimal также на стороне .NET.
  • Если вы используете двоичную с плавающей запятой в SQL-сервере, я ожидаю, что результат в .NET будет таким же: ближайшее двоичное значение с плавающей запятой соответствующего типа к числу, которое вы ввели изначально.То, что SQL Server показывает , а значение 1,3 означает, что оно равно ровно 1,3.

Использование моего DoubleConverter похоже, что самое близкое значение double к 1.3 на самом деле составляет 1.3000000000000000444089209850062616169452667236328125 - поэтому я не уверен, почему вы получите значение, которое вы на самом деле видите.Ближайшее значение float равно 1,2999999523162841796875, и это звучит так, как будто вы получаете это.Таким образом, ваше значение в базе данных преобразуется в 32-разрядное число с плавающей запятой вместо 64-разрядного.

Действительно ли поле вашей базы данных что-то вроде FLOAT(23)?Если это так, это соответствует .NET float вместо double.Это объясняет вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...