Sevdim MONEY! Bu değerden daha ucuz bir bayttır DECIMALve hesaplamalar daha hızlı gerçekleşir, çünkü (kapakların altında) toplama ve çıkarma işlemleri esasen tamsayı işlemleridir. @ SQLMenace'in - habersiz için büyük bir uyarı olan INTörneği, sonucun sıfır olacağı egers'e eşit olarak uygulanabilir . Ama bu integers- kullanmak için hiçbir neden var uygun .
Yani, mükemmel bir şekilde 'güvenli' ve MONEYuğraştığınız zaman MONEYkullanmak ve onu takip eden matematiksel kurallara göre kullanmak için uygundur ( INTeger ile aynı ).
SQL Server MONEY'ın bölünmesini ve çoğaltılmasını DECIMALs (veya FLOATs'ye) yükseltmesi daha iyi olurdu , ama bunu yapmayı seçmediler; ne de INTböldüklerinde egleri FLOATs'ye yükseltmeyi seçmediler .
MONEYhassas bir sorunu yoktur; Bu DECIMALhesaplamalar sırasında kullanılan daha büyük bir ara tür olsun sadece bu tür kullanmanın bir 'özellik' (ve aslında bu 'özellik' ne kadar uzandığından emin değilim).
Belirli bir soruyu cevaplamak için “zorlayıcı bir neden” mi? Peki, bir SUM(x)yerde mutlak maksimum performans istiyorsanız xya DECIMALda olabilir MONEY, o MONEYzaman bir kenarı olacaktır.
Ayrıca, daha küçük kuzen olduğunu unutmayın SMALLMONEY- sadece 4 bayt, ancak maksimumda 214,748.3647- para için oldukça küçüktür - ve genellikle iyi bir uyum değildir.
Etraftaki noktayı daha büyük ara türler kullanarak kanıtlamak için, DECIMALaracıyı bir değişkene açıkça atarsanız , aynı sorunla karşılaşırsınız:
declare @a decimal(19,4)
declare @b decimal(19,4)
declare @c decimal(19,4)
declare @d decimal(19,4)
select @a = 100, @b = 339, @c = 10000
set @d = @a/@b
set @d = @d*@c
select @d
Üretir 2950.0000(tamam, en azından kesilmiş DECIMALyerine en azından yuvarlak - MONEYtamsayı ile aynıdır.)
DECIMAL(19, 4)popüler bir seçim olduğunu kontrol bu da kontrol buraya kullanımına kaç ondalık basamak karar vermek Dünya Para Biçimleri, umut yardımcı olur.