piatok 29. apríla 2011

Pozor na nepresnosti pri pohyblivej radovej čiarke v dátach SQL servera

Dva najčastejšie používané dátové typy na reprezentáciu číselných hodnôt v dátach SQL Servera vám môžu spôsobiť problémy, keďže hodnota môže byť interpretovaná po častiach – celočíselnej zložky a pohyblivej (desatinnej) zložky. SQL Server pohyblivú zložku zaokrúhľuje, a preto by ste ju nemali používať v prípadoch, kedy potrebujete absolútnu presnosť. Prekvapilo vás to? Nemajte preto zlý pocit. Mnoho databázových administrátorov si tento fakt neuvedomuje, ale jednoduchý experiment to dokazuje.

Skúste spustiť nasledujúci dopyt a uvidíte, o čom hovoríme:

DECLARE @TestValue float — or real
SET @TestValue = 6.9
SELECT TestValue = @TestValue

Nebudete vidieť výsledok, aký by ste očakávali (6,9). Skôr uvidíte 6,9000000000000004 pre typ float alebo 6,9000001 pre typ real. (Nezabudnite, že v skutočnosti je typ real len synonymom pre float(24)).

Prečo k tomu dochádza? Podľa SQL BOL, pohyblivá desatinná čiarka je „približná“ zámerne a "nie všetky hodnoty v rozsahu dátového typu môže byť presne vyjadrené." Takže čo urobíte, keď potrebujete presne vyjadrené desatinné číslo? Použijete celé číslo.