C#中用于赚钱的最佳数据类型是什么?
答案 0 :(得分:376)
正如decimal所描述的那样:
decimal关键字表示128位数据类型。相比 浮点类型,十进制类型具有更高的精度和a 较小的范围,这使其适合金融和货币 计算
您可以按如下方式使用小数:
decimal myMoney = 300.5m;
答案 1 :(得分:110)
十进制值类型表示十进制数,范围从正数79,228,162,514,264,337,593,543,950,335到负数79,228,162,514,264,337,593,543,950,335。 Decimal值类型适用于需要大量有效积分和小数位且没有舍入误差的财务计算。 Decimal类型不会消除舍入的需要。相反,它最小化了由于四舍五入造成的错误。
我想通过zneak指出this excellent answer为什么不应该使用double。
答案 2 :(得分:62)
使用Money pattern中的Patterns of Enterprise Application Architecture;将金额指定为十进制,将货币指定为枚举。
答案 3 :(得分:20)
小数。如果你选择加倍,那么你就会对四舍五入的错误持开放态度
答案 4 :(得分:15)
decimal的范围更小,但精度更高 - 所以你不会随着时间的推移丢失所有这些便士!
此处详细信息:
答案 5 :(得分:13)
同意Money模式:使用小数时处理货币太麻烦了。
如果你创建了一个Currency-class,那么你可以把所有与钱相关的逻辑放在那里,包括一个正确的ToString()方法,更多的解析值控制和更好的分割控制。
此外,对于Currency类,没有机会无意中将资金与其他数据混合在一起。
答案 6 :(得分:9)
另一个选项(特别是如果你在滚动你自己的类)是使用int或int64,并将低四位数(或甚至可能是2)指定为“小数点右边”。因此,“在边缘”你需要一些“* 10000”的路上和一些“/ 10000”的出路。这是Microsoft SQL Server使用的存储机制,请参阅http://msdn.microsoft.com/en-au/library/ms179882.aspx
这样做的好处是所有的求和都可以使用(快速)整数运算来完成。
答案 7 :(得分:5)
我使用的大多数应用程序都使用decimal
来代表金钱。这是基于这样的假设:应用程序永远不会涉及多种货币。
此假设可能基于另一个假设,即该应用程序永远不会用于其他货币不同的国家。我见过那些被证明是假的案件。
现在这种假设正在以一种新的方式受到挑战:比特币等新货币变得越来越普遍,而且它们并不是针对任何国家的。仅在一个国家/地区使用的应用程序可能仍需要支持多种货币并非不切实际。
有些人会说,仅仅为了钱而创造甚至使用一种类型的是镀金,"或者增加超出已知要求的额外复杂性。我非常不同意。在您的域中越普遍存在一个概念,就越需要合理地预先使用正确的抽象。如果您想查看复杂性,请尝试使用过去使用decimal
的应用程序,现在每个Currency
属性旁边都有一个decimal
属性。
如果你预先使用了错误的抽象,那么以后更换它将是工作量的一百倍。这意味着可能会在现有代码中引入缺陷,最好的部分是这些缺陷可能涉及金额,金钱交易或任何有钱的事情。
使用十进制以外的东西并不困难。 Google" nuget money type"而且你会发现许多开发人员已经创建了这样的抽象(包括我)。这很简单。它就像使用DateTime
一样简单,而不是在string
中存储日期。
答案 8 :(得分:4)
创建自己的类。这似乎很奇怪,但.Net类型不足以涵盖不同的货币。