11.02.2014, Vladimír Klaus, navštíveno 16194x
Funkce slouží k zaokrouhlování na zadaný počet desetinných míst. Zaokrouhlování probíhá trochu specifickým způsobem. Cokoliv většího než 0,5 se zaokrouhlí nahoru, menší než 0,5 se zaokrouhlí dolu a pokud číslo končí přesně 0,5 pak se zaokrouhlí k nebližšímu sudému číslu (např. 1,5 se zaokrouhlí na 2 a 2,5 se také zaokrouhlí na 2). Řešením problému s 0,5 může být například to, že k číslu, které zaokrouhlujeme, přičteme 0,000001 nebo nějaké podobné malé číslo.
Možná je na místě vysvětlit, proč je zaokrouhlování takto divné. Je to z historických důvodů, kdy se takto zaokrouhlovala čísla ve finančních institucích a díky tomu docházelo k lehkému posunu (navyšování) výsledných částek, protože každé číslo, které bylo přesně mezi, se zaokrouhlilo nahoru. Díky současnému řešení se zaokrouhluje jednou dolů, jednou nahoru, což při velkém množství čísel dává vyváženější výsledek.
Poznámka: Vždy si ověřte, jak obdobná funkce funguje ve vaší databázi. Může například vždy zaokrouhlovat nahoru nebo vždy na sudá čísla apod.
Tímto dotazem si zobrazíme jednu patnáctinu z částek uvedených v objednávkách a pak ještě se zaokrouhlením na 5 desetinných míst.
SELECT Castka/15 AS Patnactina, ROUND(Castka/15, 5) AS Zaokrouhleno
FROM Objednavky
Pokud počet desetinných míst nezadáme, je to stejné, jako bychom zadali 0. Dojde k zaokrouhlení na celá čísla. Tyto dva příkazy jsou tedy ekvivalentní.
SELECT ROUND(Castka, 0) AS Zaokrouhleno FROM Objednavky
SELECT ROUND(Castka) AS Zaokrouhleno FROM Objednavky
I když funkce umí zaokrouhlovat pouze dle desetinných míst, docílíme malým trikem zaokrouhlení třeba na celé 100 nahoru.
SELECT Castka, 100*ROUND(Castka/100+0.5) AS ZaokrouhlenoNa100
FROM Objednavky
Když se podíváte na výsledek v tabulce vypadá to všechno naprosto správně. Ale zkusme si dotaz, kde jsou částky už zaokrouhlené.
SELECT 100*ROUND(500/100+0.5) AS PetSet,
100*ROUND(400/100+0.5) AS CtyriSta
Díky výše uvedené specialitě při zaokrouhlování se nám z 500 stane 600, což je hodně nepříjemné. Řešením je (pro tento případ zaokrouhlování) přičítání 0,4999999.
SELECT
100*ROUND(400/100+0.499999) AS CtyriSta,
100*ROUND(420/100+0.499999) AS CtyriStaDvacet,
100*ROUND(450/100+0.499999) AS CtyriSetPadesat,
100*ROUND(470/100+0.499999) AS CtyriStaSedmdesat,
100*ROUND(500/100+0.499999) AS PetSet,
100*ROUND(520/100+0.499999) AS PetStaDvacet,
100*ROUND(550/100+0.499999) AS PetSetPadesat
Pro jistotu přepíšeme zaokrouhlovací funkci na částky u objednávek. Výsledek je naštěstí stále správný a pokryje nám všechny případy.
SELECT Castka, 100*ROUND(Castka/100+0.499999) AS ZaokrouhlenoNa100
FROM Objednavky