C # para için kullanılacak en iyi veri türü nedir?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/…
C # para için kullanılacak en iyi veri türü nedir?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/…
Yanıtlar:
Ondalık olarak tanımlandığı gibi:
Ondalık anahtar kelime 128 bit veri türünü belirtir. Kayan noktalı türlerle karşılaştırıldığında, ondalık tür daha hassas ve daha küçük bir aralığa sahiptir, bu da onu finansal ve parasal hesaplamalar için uygun hale getirir .
Ondalık bir sayıyı aşağıdaki gibi kullanabilirsiniz:
decimal myMoney = 300.5m;
Ondalık değer türü, pozitif 79,228,162,514,264,337,593,543,950,335 ile negatif 79,228,162,514,264,337,593,543,950,335 arasında değişen ondalık sayıları temsil eder. Ondalık değer türü, çok sayıda önemli integral ve kesirli basamak gerektiren ve yuvarlama hatası gerektirmeyen finansal hesaplamalar için uygundur. Ondalık tip, yuvarlama ihtiyacını ortadan kaldırmaz. Aksine, yuvarlamadan kaynaklanan hataları en aza indirir.
Neden zneak'in neden çifte kullanılmaması gerektiğine dair bu mükemmel cevaba işaret etmek istiyorum .
Kullanım Para desen dan Kurumsal Uygulama Mimarlık Patterns ; tutarı ondalık, para birimini bir enum olarak belirtin.
Money
külçenin proje sitesi için ölü bir github bağlantısı var yani ... belge yok mu?
Ondalık. Eğer çift seçerseniz kendinizi yuvarlama hatalarına açık bırakıyorsunuz
double
yuvarlama hataları verebilir çünkü kayan nokta tüm sayıları tam olarak temsil edemez (örn. 0.01 kayan noktada tam bir temsili yoktur). Decimal
Öte yandan, yok sayıları temsil aynen . ( Decimal
Değişkenlik kayan noktadan daha küçük bir aralığa sahiptir) Kayan nokta size * yanlışlıkla * yuvarlama hataları verebilir (örn. 0.01+0.01 != 0.02
). Decimal
size yuvarlama hataları verebilir, ancak yalnızca istediğiniz zaman (örn. Math.Round(0.01+0.02)
sıfır döndürür)
double
uygun olduğunda ölçeklendirme ve alana özgü yuvarlama kullanır ve dikkatle uygularsa , mükemmel bir şekilde kesin olabilir. Biri yuvarlamada özensiz ise decimal
, anlamsal olarak yanlış sonuçlar verebilir (örneğin, bir kişi en yakın kuruşa yuvarlanması gereken, ancak aslında ilk önce onların etrafında olmayan) birden fazla değer eklerse). Bununla ilgili tek iyi şey decimal
, ölçeklemenin yerleşik olmasıdır.
ondalık daha küçük bir aralığa sahiptir, ancak daha büyük bir hassasiyete sahiptir - böylece zamanla tüm bu kuruşları kaybetmezsiniz!
Tüm ayrıntılar burada:
Para modeliyle aynı fikirde olun: Ondalık sayılar kullandığınızda para birimleri kullanmak çok zahmetlidir.
Bir Currency sınıfı oluşturursanız, parayla ilgili tüm mantığı, doğru ToString () - yöntemi, değerleri ayrıştırmada daha fazla denetim ve bölümlerde daha iyi denetim de dahil olmak üzere oraya koyabilirsiniz.
Ayrıca, bir Currency sınıfı ile, yanlışlıkla diğer verilerle para karıştırma şansı yoktur.
Başka bir seçenek (özellikle kendi sınıfınızı döndürüyorsanız) bir int veya int64 kullanmak ve alt dört basamağı (veya muhtemelen 2) "ondalık noktasının sağı" olarak atamaktır. Yani "kenarlarda" girerken bazı "* 10000" ve çıkışta bazı "/ 10000" gerekir. Bu, Microsoft'un SQL Server tarafından kullanılan depolama mekanizmasıdır, bkz. Http://msdn.microsoft.com/en-au/library/ms179882.aspx
Bunun güzelliği, tüm özetlemenizin (hızlı) tamsayı aritmetiği kullanılarak yapılabilmesidir.
decimal
Parayı temsil etmek için kullandığım çoğu uygulama . Bu, başvurunun asla birden fazla para birimiyle ilgilenmeyeceği varsayımına dayanmaktadır.
Bu varsayım, uygulamanın hiçbir zaman farklı para birimlerine sahip diğer ülkelerde kullanılmayacağı başka bir varsayımı temel alabilir. Bunun yanlış olduğu kanıtlanmış vakalar gördüm.
Şimdi bu varsayım yeni bir şekilde zorlanıyor: Bitcoin gibi yeni para birimleri daha yaygın hale geliyor ve herhangi bir ülkeye özgü değiller. Sadece bir ülkede kullanılan bir uygulamanın yine de birden fazla para birimini desteklemesi gerekebilir.
Bazı insanlar sadece para için bir tür oluşturmanın, hatta kullanmanın "altın kaplama" olduğunu veya bilinen gereksinimlerin ötesinde ekstra karmaşıklık eklediğini söyleyecektir. Kesinlikle katılmıyorum. Bir kavram alan adınızda ne kadar yaygınsa, doğru soyutlamayı kullanmak için makul bir çaba sarf etmek o kadar önemlidir. Karmaşıklığı görmek istiyorsanız, daha önce kullanılan bir uygulamada çalışmayı deneyin decimal
ve şimdi Currency
her decimal
özelliğin yanında ek bir özellik var.
Ön tarafta yanlış soyutlama kullanırsanız, daha sonra değiştirmek yüz kat daha fazla iş olacaktır. Bu, potansiyel olarak mevcut koda kusur getirme anlamına gelir ve en iyi yanı, bu kusurların büyük olasılıkla para, para ile işlemler veya sadece para ile herhangi bir şey içermesidir.
Ondalıktan başka bir şey kullanmak o kadar da zor değil. Google "nuget para türü" ve çok sayıda geliştiricinin bu tür soyutlamaları (ben dahil) oluşturduğunu göreceksiniz. DateTime
A'da bir tarih depolamak yerine kullanmak kadar kolaydır string
.
Kendi sınıfınızı oluşturun. Bu tuhaf görünüyor, ancak .Net türü farklı para birimlerini karşılamak için yetersiz.