Извлечение SQL Server float с помощью C # sqldatareader

#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. Эти инструменты преобразовали фактическую двоичную структуру с плавающей запятой, хранящуюся в базе данных, в десятичную строку для целей отображения.