Числа с плавающей запятой (ADO.NET)
Обновлен: November 2007
В этом разделе описаны некоторые из проблем, с которыми разработчики часто встречаются при работе с числами с плавающей запятой в ADO.NET. Эти проблемы вызваны способом, которым эти числа хранятся в компьютерах, и не характерны для определенных поставщиков, например System.Data.SqlClient или System.Data.OracleClient.
Числа с плавающей запятой, как правило, не имеют точного двоичного представления. Вместо этого в компьютере сохраняется приближение числа. В разное время для представления числа может использоваться разное число двоичных цифр. При преобразовании числа с плавающей запятой из одного представления в другое наименее значительные цифры этого числа могут немного отличаться. Обычно преобразование происходит при приведении числа из одного типа в другой. При выполнении преобразования между типами, представляющими значения базы данных, или между типами базы данных происходит отклонение. Вследствие этих изменений числа, которые логически равны, могут отличаться своими наименее значительными цифрами, что приводит к отличию между их значениями. Количество разрядов точности в числе может быть больше или меньше ожидаемого. При форматировании в виде строки число может не отображать ожидаемое значение.
Для минимизации этих эффектов необходимо использовать ближайшее соответствие между доступными числовыми типами. Например, при работе с SQL Server точное числовое значение может меняться при преобразовании значения Transact-SQL типа real в значение типа float. В платформе .NET Framework преобразование Single в Double может привести к непредвиденным результатам. В обоих случаях хорошей стратегией является обеспечение использования всеми значениями приложения одинакового числового типа. Также можно использовать десятичный тип с фиксированной точностью или приводить числа с плавающей запятой к этому типу перед работой с ними.
Чтобы обойти проблемы со сравнением на равенство, рассмотрите использование кодирования приложения, чтобы отклонения в наименее значительных разрядах не учитывались. Например, вместо сравнения двух чисел — вычитать одно из другого. Если разница лежит в пределах допустимого поля округлений, то приложение рассматривает числа как одинаковые.