C#中用于货币的最佳数据类型是什么?
如decimal所述:
decimal关键字表示128位数据类型。与浮点类型相比,decimal类型具有更高的精度和更小的范围,这使其适用于财务和货币计算。
您可以按以下方式使用decimal:
decimal myMoney = 300.5m;
十进制数值类型(Decimal)表示从正79,228,162,514,264,337,593,543,950,335到负79,228,162,514,264,337,593,543,950,335之间的十进制数。Decimal类型适用于需要大量有效整数和小数位且不需要舍入误差的金融计算。Decimal类型不能完全消除舍入的需要,但它可以最小化由于舍入引起的误差。
我想指向zneak关于为什么不能使用double来表示货币的这个优秀回答。
Money
NuGet 包的项目站点链接已经失效了,所以...没有文档? - George MauerMoney
包已经在保险库中了:https://github.com/danielcrenna/vault/tree/master/money - DotNetMatt十进制。如果你选择双精度,那么你会面临舍入误差的风险。
double
可能会引入舍入误差,因为浮点数不能准确表示所有数字(例如,0.01 在浮点数中没有精确的表示)。另一方面,Decimal
可以 准确表示数字。(权衡是 Decimal
的范围比浮点数小)浮点数可能会给出意外的舍入误差(例如,0.01+0.01 != 0.02
)。Decimal
可以产生舍入误差,但只有在你要求时才会产生(例如,Math.Round(0.01+0.02)
返回零)。 - Ian Boyddouble
并在适当时候仔细应用缩放和特定于域的舍入,它可以完全精确。如果在舍入方面粗心大意,则decimal
可能会产生语义上不正确的结果(例如,如果将多个应该四舍五入到最近的一分钱的值相加,但实际上没有先进行四舍五入)。decimal
唯一好的地方是内置了缩放。 - supercat十进制数具有较小的范围,但更高的精度-因此您不会随着时间的推移丢失所有那些分钱!
完整详情请参见:
支持货币模式:使用小数处理货币太过繁琐。
如果您创建一个货币类,那么可以把所有与货币相关的逻辑都放在那里,包括正确的ToString()方法、更好的控制解析值和更好的控制除法。
此外,使用货币类,不会意外地将货币与其他数据混淆。
decimal
来表示货币。这是基于一个假设,即该应用程序永远不会涉及到超过一种货币。这个假设可能是基于另一个假设,即该应用程序永远不会在其他国家使用不同的货币。我见过这种假设被证明是错误的情况。decimal
的应用程序中工作,现在每个decimal
属性旁边都有一个额外的Currency
属性。DateTime
而不是在string
中存储日期一样容易。
using System.ComponentModel.DataAnnotations;
...[DataType(DataType.Currency)]
https://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.datatype(v=vs.110).aspx - JohnLBevan