关于货币:C#中用于赚钱的最佳数据类型是什么?

What is the best data type to use for money in C#?

在C中,哪种数据类型最适合用于金钱?


如十进制所述:

The decimal keyword indicates a 128-bit data type. Compared to
floating-point types, the decimal type has more precision and a
smaller range, which makes it appropriate for financial and monetary
calculations.

您可以使用以下小数:

1
decimal myMoney = 300.5m;


十进制系统

The Decimal value type represents decimal numbers ranging from positive 79,228,162,514,264,337,593,543,950,335 to negative 79,228,162,514,264,337,593,543,950,335. The Decimal value type is appropriate for financial calculations requiring large numbers of significant integral and fractional digits and no round-off errors. The Decimal type does not eliminate the need for rounding. Rather, it minimizes errors due to rounding.

我想指出zneak给出的这个很好的答案,为什么不应该使用double。


使用企业应用程序体系结构模式中的货币模式;将金额指定为十进制,货币指定为枚举。


十进制的。如果选择"双精度",则会出现舍入误差。


十进制的范围更小,但精度更高——所以你不会随着时间的推移而失去所有的硬币!

详细信息如下:

http://msdn.microsoft.com/en-us/library/364X0Z75.aspx


同意货币模式:使用小数时处理货币太麻烦了。

如果您创建了一个货币类,那么您就可以将所有与货币相关的逻辑放在那里,包括一个正确的toString()-方法、对解析值的更多控制和对划分的更好控制。

此外,对于货币类,不可能无意中将钱与其他数据混合在一起。


另一个选项(尤其是当您滚动自己的类时)是使用int或int64,并将较低的四位数(甚至可能是2)指定为"小数点的右边"。所以"在边缘",你需要一些"*10000"在路上,一些"/10000"在路上。这是Microsoft的SQL Server使用的存储机制,请参阅http://msdn.microsoft.com/en-au/library/ms179882.aspx

这一点的好处是,所有的求和都可以使用(快速)整数算法完成。


我处理过的大多数应用程序都使用decimal来表示金钱。这是基于这样一个假设:应用程序永远不会涉及多个货币。

这一假设可能是基于另一个假设,即应用程序将永远不会在其他货币不同的国家使用。我看过那些被证明是错误的案例。

现在这一假设正以一种新的方式受到挑战:比特币等新货币正变得越来越普遍,而且它们并不特定于任何国家。仅仅在一个国家使用的应用程序可能仍然需要支持多种货币,这并不不切实际。

有些人会说,仅仅为了钱而创建或使用一个类型是"镀金",或者在已知需求之外增加额外的复杂性。我强烈反对。概念在您的领域中越普遍,越重要的是尽合理的努力提前使用正确的抽象。如果您希望看到复杂性,请尝试在以前使用decimal的应用程序中工作,现在每个decimal属性旁边都有一个额外的Currency属性。

如果您在前面使用了错误的抽象,那么稍后替换它将是100倍以上的工作。这意味着潜在地在现有代码中引入缺陷,而最好的部分是,这些缺陷可能涉及到大量的金钱、金钱交易或任何金钱交易。

使用十进制以外的东西并不难。谷歌"nuget-money-type",你会发现很多开发者(包括我)都创建了这样的抽象,这很容易。这就像使用DateTime而不是在string中存储日期一样简单。


创建自己的类。这看起来很奇怪,但是.NET类型不足以覆盖不同的货币。