Sdílet prostřednictvím


Čísla s plovoucí desetinnou čárkou

Toto téma popisuje některé problémy, se kterými se vývojáři často setkávají, když pracují s čísly s plovoucí desetinou čárkou v ADO.NET. Tyto problémy jsou způsobeny způsobem, jakým počítače ukládají čísla s plovoucí desetinou čárkou, a nejsou specifické pro konkrétního poskytovatele, například System.Data.SqlClient nebo System.Data.OracleClient.

Čísla s plovoucí desetinou čárkou obvykle nemají přesnou binární reprezentaci. Místo toho počítač ukládá aproximaci čísla. V různých časech lze k reprezentaci čísla použít různá čísla binárních číslic. Pokud je číslo s plovoucí desetinou čárkou převedeno z jedné reprezentace na jinou reprezentaci, mohou se nejméně významné číslice tohoto čísla mírně lišit. K převodu obvykle dochází při přetypování čísla z jednoho typu do jiného typu. K této variantě dochází bez ohledu na to, jestli se převod vyskytuje v databázi, mezi typy představujícími hodnoty databáze nebo mezi typy. Kvůli těmto změnám můžou čísla, která by byla logicky rovna, obsahovat změny v nejméně významných číslicích, které způsobují, že mají různé hodnoty. Počet číslic přesnosti v čísle může být větší nebo menší, než se čekalo. Při formátování jako řetězec nemusí číslo zobrazovat očekávanou hodnotu.

Pokud chcete tyto efekty minimalizovat, měli byste použít nejbližší shodu mezi číselnými typy, které jsou vám k dispozici. Pokud například pracujete s SQL Serverem, může se přesná číselná hodnota změnit, pokud převedete hodnotu transact-SQL skutečného typu na hodnotu typu float. V rozhraní .NET Framework může převod na Single objekt a může také vést k neočekávaným výsledkům Double . V obou těchto případech je dobrou strategií, aby všechny hodnoty v aplikaci používaly stejný číselný typ. Před zahájením práce s desetinnými místy můžete také použít desetinný typ s pevnou přesností nebo přetypovat čísla s plovoucí desetinnou čárkou na desetinný typ s pevnou přesností.

Pokud chcete vyřešit problémy s porovnáním rovnosti, zvažte kódování aplikace tak, aby se ignorovaly varianty nejméně významných číslic. Místo porovnání například zjistíte, jestli jsou dvě čísla rovna, odečtěte jedno číslo od druhého čísla. Pokud je rozdíl v přijatelném okraji zaokrouhlení, může vaše aplikace považovat čísla za stejná.

Viz také