在C#中用於賺錢的最佳數據類型是什麼? spa
另外一個選項(特別是若是你正在推進本身的類)是使用int或int64,並將低四位數(或可能甚至2)指定爲「小數點右邊」。 所以,「在邊緣」你須要一些「* 10000」的路上和一些「/ 10000」的出路。 這是Microsoft SQL Server使用的存儲機制,請參閱http://msdn.microsoft.com/en-au/library/ms179882.aspx code
這種狀況的不一樣之處在於,全部求和均可以使用(快速)整數運算來完成。 ci
我使用過的大多數應用程序都使用decimal
表明錢。 這是基於這樣的假設:應用程序永遠不會涉及多種貨幣。 開發
該假設能夠基於另外一個假設,即該應用程序永遠不會用於具備不一樣貨幣的其餘國家。 我見過那些被證實是錯誤的案例。 get
如今,這種假設正在以一種新的方式受到挑戰:比特幣等新貨幣變得愈來愈廣泛,而且它們並非針對任何國家的。 僅在一個國家/地區使用的應用程序可能仍須要支持多種貨幣並不是不切實際。 string
有些人會說,僅僅爲了賺錢而創造甚至使用一種類型是「鍍金」,或者增長超出已知要求的額外複雜性。 我很是不一樣意。 在您的域中越廣泛存在一個概念,就越須要合理地預先使用正確的抽象。 若是要查看複雜性,請嘗試使用之前使用decimal
的應用程序,如今每一個decimal
屬性旁邊都有一個額外的Currency
屬性。 io
若是你預先使用了錯誤的抽象,那麼之後更換它將是工做量的一百倍。 這意味着可能會在現有代碼中引入缺陷,最好的部分是這些缺陷可能涉及金額,金錢交易或任何有錢的事情。 比特幣
使用十進制之外的東西並不困難。 谷歌「nuget money type」,你會發現許多開發者已經建立了這樣的抽象(包括我)。這很簡單。 它就像使用DateTime
而不是在string
中存儲日期同樣簡單。 數據類型
System.Decimal bug
十進制值類型表示十進制數,範圍從正數79,228,162,514,264,337,593,543,950,335到負數79,228,162,514,264,337,593,543,950,335。 Decimal值類型適用於須要大量有效積分和小數位且沒有舍入偏差的財務計算。 Decimal類型不會消除舍入的須要。 相反,它最大限度地減小了因舍入而致使的錯誤。
我想指出zneak關於爲何不該該使用double 這個優秀的答案 。
正如在十進制中描述的那樣:
decimal關鍵字表示128位數據類型。 與浮點類型相比,十進制類型具備更高的精度和更小的範圍,這使其適用於財務和貨幣計算。
您可使用小數以下:
decimal myMoney = 300.5m;
小數。 若是你選擇加倍,那麼你就會對四捨五入的錯誤開放