Liczby zmiennoprzecinkowe

W tym temacie opisano niektóre problemy, które deweloperzy często napotykają podczas pracy z liczbami zmiennoprzecinkowych w ADO.NET. Te problemy są spowodowane przez sposób, w jaki komputery przechowują liczby zmiennoprzecinkowe i nie są specyficzne dla określonego dostawcy, takiego jak System.Data.SqlClient lub System.Data.OracleClient.

Liczby zmiennoprzecinkowe zazwyczaj nie mają dokładnej reprezentacji binarnej. Zamiast tego komputer przechowuje przybliżenie liczby. W różnym czasie różne liczby cyfr binarnych mogą służyć do reprezentowania liczby. Gdy liczba zmiennoprzecinkowa jest konwertowana z jednej reprezentacji na inną, najmniej znaczące cyfry tej liczby mogą się nieznacznie różnić. Konwersja zwykle występuje, gdy liczba jest rzutowana z jednego typu na inny typ. Odmiana występuje, czy konwersja odbywa się w bazie danych, między typami reprezentującymi wartości bazy danych, czy między typami. Ze względu na te zmiany liczby, które logicznie byłyby równe, mogą mieć zmiany w ich najmniej znaczących cyfrach, które powodują, że mają różne wartości. Liczba cyfr dokładności w liczbie może być większa lub mniejsza niż oczekiwano. W przypadku formatowania jako ciągu liczba może nie wyświetlać oczekiwanej wartości.

Aby zminimalizować te efekty, należy użyć najbliższego dopasowania między typami liczbowymi, które są dostępne dla Ciebie. Jeśli na przykład pracujesz z programem SQL Server, dokładna wartość liczbowa może ulec zmianie, jeśli przekonwertujesz wartość transact-SQL typu rzeczywistego na wartość typu zmiennoprzecinkowego. W programie .NET Framework konwertowanie elementu Single na element Double może również spowodować nieoczekiwane wyniki. W obu tych przypadkach dobrą strategią jest uczynienie wszystkich wartości w aplikacji tym samym typem liczbowym. Można również użyć typu dziesiętnego o stałej precyzji lub rzutowania liczb zmiennoprzecinkowych do typu dziesiętnego o stałej precyzji przed rozpoczęciem pracy z nimi.

Aby obejść problemy z porównaniem równości, rozważ kodowanie aplikacji, aby różnice w najmniej znaczących cyfrach zostały zignorowane. Na przykład zamiast porównywać, aby sprawdzić, czy dwie liczby są równe, odejmuje jedną liczbę z drugiej liczby. Jeśli różnica mieści się w akceptowalnym marginesie zaokrąglania, aplikacja może traktować liczby tak, jakby były takie same.

Zobacz też