Papuccino,
Nedoporučuji typy peněz a malých peněz, pokud si nejste jisti, že jedinou aritmetikou, kterou plánujete udělat, je sčítání a odčítání. Pokud máte co do činění se směnnými kurzy, procenty a tak dále, riskujete u těchto typů skutečné problémy.
Zde je jen jeden malý příklad, který vám ukáže rozdíl mezi používáním peněz, desítkové soustavy a pohyblivé, pokud jde o dělení. Je možné vymyslet příklady, kde je rozdíl mnohem dramatičtější.
declare @m1 money, @m2 money, @m3 money
declare @d1 decimal(19,4), @d2 decimal(19,4), @d3 decimal(19,4)
declare @f1 float, @f2 float, @f3 float;
set @m1 = 1.00;
set @m2 = 345.00;
set @m3 = @m1/@m2;
set @d1 = 1.00;
set @d2 = 345.00;
set @d3 = @d1/@d2;
set @f1 = 1.00;
set @f2 = 345.00;
set @f3 = @f1/@f2;
select @m3, @d3, @f3;
Výsledek:0,0028 0,0029 0,00289855072463768
V závislosti na odvětví mohou existovat pokyny nebo předpisy, které vám pomohou rozhodnout se pro správný typ dat. Neexistuje žádná správná odpověď.
Přidané poznámky:
Máte pravdu, že peníze/peníze by neměly být peníze, ale SQL Server (nevysvětlitelně) vytváří přesně ten výsledek:zadejte peníze z podílu dvou peněžních hodnot. To je falešné, ale jak vidíte z příkladu níže, je to to, co dostanete, i když to nedává smysl:
declare @m1 money, @m2 money;
declare @d1 decimal(19,4), @d2 decimal(19,4);
set @m1 = 1.00;
set @m2 = 345.00;
set @d1 = 1.00;
set @d2 = 345.00;
select @m1/@m2, @d1/@d2
Výsledek:0,0028 0,0028985507246376811
Výsledek s typem peníze, 0,0028, je o 3–4 % nižší než správný výsledek.
Samozřejmě existuje mnoho situací, kdy potřebujete rozdělit hodnoty měny. Nebezpečí použití peněžního typu spočívá v tom, že kvocient je nesprávného typu (a odpověď není dostatečně blízká správné). Příklady otázek, které vyžadují rozdělení měny:
Předpokládejme, že si směníte 320 juanů a banka vám dá 47,3 amerických dolarů. Jaký je směnný kurz, který jste dostali?
Předpokládejme, že investujete 23 USD a o rok později to bude mít hodnotu 31 USD. Jaká je vaše procentuální míra návratnosti?
Oba tyto výpočty vyžadují rozdělení hodnot měn.