在C#中最适合用来赚钱的数据类型是什么?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/...
在C#中最适合用来赚钱的数据类型是什么?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/...
Answers:
正如十进制所描述的那样:
十进制关键字表示128位数据类型。与浮点类型相比,十进制类型具有更高的精度和更小的范围,这使其适用于财务和货币 计算。
您可以使用小数,如下所示:
decimal myMoney = 300.5m;
使用来自企业应用程序架构模式的Money模式 ; 将金额指定为小数,将货币指定为枚举。
Money
nuget有一个指向项目站点的github链接,所以...没有文档?
十进制。如果您选择double,则很容易出现舍入错误
double
会引入舍入错误,因为浮点不能完全表示所有数字(例如0.01不能精确表示浮点数)。Decimal
,而另一方面,也代表数字准确。(折衷Decimal
范围小于浮点数)浮点数会给您*无意*舍入误差(例如0.01+0.01 != 0.02
)。Decimal
会给您舍入错误,但只有在您要求时才出现(例如,Math.Round(0.01+0.02)
返回零)
double
在适当的情况下使用并仔细应用了缩放和特定于域的舍入,则可以非常精确。如果某人四舍五入,decimal
可能会产生语义上不正确的结果(例如,如果将多个值加在一起应被四舍五入到最接近的便士,但实际上并没有首先围绕它们)。唯一的好处decimal
是缩放是内置的。
小数的范围较小,但精度更高-因此,随着时间的流逝,您不会损失所有这些便士!
详细信息在这里:
另一个选择(特别是如果要滚动自己的类)是使用int或int64,并将低四位数字(甚至可能是2)指定为“小数点右边”。因此,“在边缘”在进入时需要一些“ * 10000”,在离开时需要一些“ / 10000”。这是Microsoft SQL Server使用的存储机制,请参阅http://msdn.microsoft.com/zh-cn/library/ms179882.aspx
唯一的问题是,您所有的求和都可以使用(快速)整数算术完成。
我使用过的大多数应用程序 decimal
用来代表金钱的。这是基于以下假设:应用程序永远不会涉及一种以上的货币。
该假设可能基于另一个假设,即该应用程序将永远不会在其他使用不同货币的国家/地区使用。我见过一些证明是错误的情况。
现在,这一假设正在以一种新的方式受到挑战:比特币等新货币正变得越来越普遍,而且它们并非特定于任何国家。仅在一个国家/地区使用的应用程序可能仍需要支持多种货币并非不现实。
有人会说创建或什至只是为了赚钱而创建的类型就是“镀金”,或者增加了超出已知要求的复杂性。我非常不同意。一个概念在您的领域中越普遍,那么做出合理的努力以预先使用正确的抽象就越重要。如果您想了解复杂性,请尝试使用一个曾经使用过的应用程序,decimal
现在Currency
每个decimal
属性旁边都有一个附加属性。
如果您预先使用了错误的抽象,那么以后进行替换将使工作量增加100倍。这意味着可能会在现有代码中引入缺陷,而最好的部分是这些缺陷可能涉及金钱,金钱交易或任何金钱交易。
使用十进制以外的其他语言并不难。Google是“零花钱类型”,您会看到许多开发人员都创建了这样的抽象(包括我自己)。这很容易。就像使用DateTime
而不是将日期存储在中一样简单string
。