我有一个(C# .NET Core
/ SQL Express
)应用程序,这对于金钱计算非常重要。我已经读过很多博客和帖子,说float
不够精确,无法存储诸如金钱价值之类的关键事物。所以我用了decimal
。
但是现在当我更深入地研究时,将所有内容都存储为integer
并只是使用美分值而不是十进制值似乎是最好的主意。因此,而不是将值存储为€1.99
。我将其存储为199
。
我的第一个问题:这真的是一种更好,更安全的方法吗?
第二,我已经有一个使用Entity Framework
的完整应用程序,该应用程序基于每个使用价格的函数中的十进制值。我认为,由于仅将值存储在数据库中可能是问题所在,因此请使用变量的getter和setter来将其转换为整数或从整数返回。
例如:
public class InvoiceDomain
{
public decimal Total {get;set;}
}
成为此:
public class InvoiceDomain
{
public int totalCents
[NotMapped]
public decimal Total
{
get { return totalCents / 100; }
set { totalCents = (int)value * 100; }
}
}
这是个好主意吗?
我会避免使用整数,因为当您需要使用分数的小数时,存储确切的分数将成为问题。这样做的需要可能会作为计算的中间结果出现,即使您不打算存储小数分。
与float
不同,小数位数非常适合存储货币金额。 SQL Server还具有money数据类型(money
和smallmoney
),它们也可以很好地工作,但是在进行数学运算时需要格外小心。
我将继续使用decimal
。如果必须计算分数,则int / int
将以double
结尾。