在C#中用于赚钱的最佳数据类型是什么?
正如在十进制中描述的那样:
decimal关键字表示128位数据类型.与浮点类型相比,十进制类型具有更高的精度和更小的范围,这使其适用于财务和货币 计算.
您可以使用小数如下:
decimal myMoney = 300.5m;
System.Decimal
十进制值类型表示十进制数,范围从正数79,228,162,514,264,337,593,543,950,335到负数79,228,162,514,264,337,593,543,950,335.十进制值类型适用于需要大量有效积分和小数位且没有舍入误差的财务计算.Decimal类型不会消除舍入的需要.相反,它最大限度地减少了因舍入而导致的错误.
我想指出zneak关于为什么不应该使用double的优秀答案.
使用货币模式从企业应用架构模式 ; 将金额指定为十进制,将货币指定为枚举.
小数.如果你选择加倍,那么你就会对四舍五入的错误开放
十进制有一个较小的范围,但更精确 - 所以你不会失去所有那些便士随着时间的推移!
详情如下:
http://msdn.microsoft.com/en-us/library/364x0z75.aspx
同意Money模式:使用小数时处理货币太麻烦了.
如果你创建了一个Currency-class,那么你就可以把所有与钱相关的逻辑放在那里,包括一个正确的ToString()方法,更好地控制解析值和更好地控制划分.
此外,使用Currency类,不会无意中将钱与其他数据混合在一起.
另一个选项(特别是如果你正在推动自己的类)是使用int或int64,并将低四位数(或可能甚至2)指定为"小数点右边".因此,"在边缘"你需要一些"*10000"的路上和一些"/ 10000"的出路.这是Microsoft SQL Server使用的存储机制,请参阅http://msdn.microsoft.com/en-au/library/ms179882.aspx
这种情况的不同之处在于,所有求和都可以使用(快速)整数运算来完成.
我使用过的大多数应用程序都是decimal
用来代表金钱的。这是基于以下假设:应用程序永远不会涉及一种以上的货币。
该假设可能基于另一个假设,即该应用程序将永远不会在其他使用不同货币的国家/地区使用。我见过一些证明是错误的情况。
现在,这一假设正在以一种新的方式受到挑战:比特币等新货币正变得越来越普遍,而且它们并非特定于任何国家。仅在一个国家/地区使用的应用程序可能仍需要支持多种货币并非不现实。
有人会说创建或什至只是为了赚钱而创建的类型就是“镀金”,或者增加了超出已知要求的复杂性。我非常不同意。一个概念在您的领域中越普遍,那么做出合理的努力以预先使用正确的抽象就越重要。如果您想了解复杂性,请尝试使用一个曾经使用过的应用程序,decimal
现在Currency
每个decimal
属性旁边都有一个附加属性。
如果您预先使用了错误的抽象,那么以后进行替换将使工作量增加100倍。这意味着可能会在现有代码中引入缺陷,而最好的部分是这些缺陷可能涉及金钱,金钱交易或任何金钱交易。
使用十进制以外的其他语言并不难。Google是“零花钱类型”,您会看到许多开发人员都创建了这样的抽象(包括我自己)。这很容易。就像使用DateTime
而不是将日期存储在中一样简单string
。