#c# #sql-server
#c# #sql-сервер
Вопрос:
Я пытаюсь получить точное значение, которое я вижу в базе данных.
Тип столбца базы данных — float . База данных не моя, и я не могу изменить ее тип или что-либо еще. В базе данных у меня есть значение 0.1, но когда я читаю его с помощью SqlDataReader.getDouble возвращает что-то вроде 0.09999 …..98.
Я также пытался использовать GetValue, а затем вручную преобразовать в double, но все равно никакой разницы.
Я также не могу использовать статическое округление, потому что, хотя это значение равно 0,1 в базе данных и считывается как 0,09 … 98, есть некоторые значения, которые имеют намного больше десятичных знаков. Например. существует значение 0,0151515151515152, которое с getDouble считывается как 0,015151515151515148
Комментарии:
1.при использовании арифметики с плавающей запятой мышление в терминах «точного значения» по своей сути является ошибкой; вы могли бы попробовать
GetDecimal
, но, честно говоря: хранилище данных звучит просто неправильно; никакие ограничения типа «я не могу изменить его тип или что-то еще» не могут это исправить. В частности,0.1
не существует с плавающей запятой, поэтому мне интересно, когда вы говорите «точное значение, которое я вижу в базе данных», имеете ли вы в виду «когда я использую инструмент пользовательского интерфейса, он округляет значение до того, чего на самом деле нет»2. Добавление к комментарию @MarcGravell, выполнение
SELECT CAST(0.1 AS float);
в SSMS показывает результат 0,1. Запустите тот же запрос с помощью SQLCMD (sqlcmd -Q "SELECT CAST(0.1 AS float);"
), и результат будет равен 0,1000000000000000001. Эти инструменты преобразовали фактическую двоичную структуру с плавающей запятой, хранящуюся в базе данных, в десятичную строку для целей отображения.