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