在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;
小数。 若是你选择加倍,那么你就会对四舍五入的错误开放