Pokud ze souborové geodatabáze do SDE geodatabáze převádíme třídu nebo tabulku se sloupcem typu float, můžeme se setkat s poněkud překvapivým chováním. Nejen že se v tomto případě změní u výsledné SDE třídy datový typ na double, ale při kontrole samotné atributové tabulky se v tomto sloupci nepatrně změní i některé hodnoty necelých čísel. Lze takovéto chování nějak vysvětlit?
Nejprve k převodu typů. U souborové geodatabáze se při specifikaci číselného datového typu sloupce neuvádí celkový počet cifer a počet míst za desetinou čárkou, naopak při specifikaci stejného typu v SDE geodatabázi se tyto parametry uvádějí kvůli lepší kontrole integrity dat v SDE. Tedy ono „plavání“ (v názvu floating point) desetinné čárky u čísel v sloupci typu float v SDE geodatabázi je již těmito parametry limitované a název float je v SDE tedy v tomto smyslu trochu zavádějící. Souborová geodatabáze nám tak například do sloupce typu float umožní uložit číslo 1234567 ale i 0,123456 (obě sedmiciferná jsou čísla bezpečně bez zaokrouhlení zapsatelná do čtyřbytového float). Jak ale specifikovat celkový počet cifer a přesnost pro číselný sloupec, aby umožnil bezpečně (tedy bez zaokrouhlení) zapsat obě taková čísla? Řešením je využití sloupce typu double.
Podobně tedy, jako když v SDE specifikujeme typ float, ale nezadáme počet cifer a počet míst za desetinou čárkou (vytvoří se preventivně osmibytový double), tak se při kopírování ze souborové geodatabáze (kde tato přesnost specifikována není) preventivně zakládá přesnější typ double, aby se všechna potenciálně kopírovaná čísla dala do SDE nahrát.
A jak je to s tou změnou hodnot ve sloupci, kdy se zdánlivě mění hodnota některých necelých čísel při kopírování? Obdobně k tomu, že se některé zlomky nedají přesně vyjádřit v desetinné číselné soustavě (např. 1/3, tedy 0,3333333…), nedají se jiné zlomky (např. 11/10) vyjádřit přesně v binární číselné soustavě. Při tvorbě binární mantisy (jakéhosi základu) čísla vznikne zacyklení obdobně jako při dělení 1/3 a pro zlomek 11/10 je výsledkem opakující se řada 0011001100110011…
Stejně jako se v desetinné číselné soustavě musíme u zápisu 1/3 smířit s tím, že nebude hodnotově nikdy přesný, je nutné se smířit i s tím, že 1,1 nebude v typu float přesně 1,1, ale číslo blízké 1,10000002384185791015625… A to se pak při převodu do přesnějšího double pochopitelně projeví. (Pro představu: v přesnějším double je 1.1 blízké hodnotě 1,100000000000000088817841970012523233890533447265625). Tak jako při programování platí zásada, že nemá cenu porovnávat proměnné typu float a double, nelze tyto hodnoty porovnávat ani v systému ArcGIS.
Jak dosáhnout toho, aby se čísla po převodu vizuálně jevila stejná? Hodnotově stejná být bezpečně nemohou, ale jevit se nám stejná i po převodu mohou. Je ale potřeba dané chování trochu obejít. Řešením je vytvořit si u třídy prvků v souborové geodatabázi sloupec typu text s textem vyjadřujícím číslo ve sloupci float a takto třídu převést. Text se totiž nijak měnit nebude.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.