C#将货币的小数转换成整数

C#将货币的小数转换成整数,c#,.net,sql-server,entity-framework,C#,.net,Sql Server,Entity Framework,我有一个(C#.NET核心/sqlexpress)应用程序,它对资金计算非常关键。我读过很多博客和帖子,说float不够精确,无法存储货币价值等重要信息。所以我用了decimal 但现在当我深入研究时,似乎最好的办法是将所有内容存储为整数,只使用美分值而不是十进制值来表示货币。因此,不要将值存储为€1.99。我将其存储为199 我的第一个问题:这真的是一种更好、更安全的方法吗 其次,我已经有了一个完整的应用程序,它使用的是实体框架,它基于每个使用价格的函数中的十进制值。 我认为,因为只在数据库中

我有一个(
C#.NET核心
/
sqlexpress
)应用程序,它对资金计算非常关键。我读过很多博客和帖子,说
float
不够精确,无法存储货币价值等重要信息。所以我用了
decimal

但现在当我深入研究时,似乎最好的办法是将所有内容存储为
整数
,只使用美分值而不是十进制值来表示货币。因此,不要将值存储为€
1.99
。我将其存储为
199

我的第一个问题:这真的是一种更好、更安全的方法吗

其次,我已经有了一个完整的应用程序,它使用的是
实体框架
,它基于每个使用价格的函数中的十进制值。 我认为,因为只在数据库中存储值可能是个问题,所以使用变量的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; } 
   }
}

这是一个好主意吗?

我不会使用整数,因为当需要使用分数时,存储精确的分数会有问题。这样做的需要可能会作为计算的中间结果出现,即使您不打算存储分数美分


与浮动不同,小数非常适合存储货币金额。SQL Server还有货币数据类型(
money
smallmoney
),它们也可以很好地工作,但在计算时需要更加小心。

我会继续使用
十进制。如果必须计算分数,
int/int
将以
int
结束。您必须进行转换并再次使用
十进制
双精度

您还需要存储指数值。。。您不能硬编码100。sql server中的浮点值不精确是正确的。但十进制数据类型是精确的。我会用十进制来代替所有这些来回的转换。您所做的是存储一个隐含的十进制数。它起作用,但迫使你不断转换你的价值观,看看它到底是什么。坚持使用十进制,省去了很多麻烦。@SeanLange非常感谢!我对互联网上所有的博客和文章都持怀疑态度。是的,在很久以前,这是一种很好的做法(当时我们没有像
decimal
,只有
double
)。现在,您可以在RDMS端对欧元使用
Number(15,2)
,在客户端使用
decimal
。您将使用多少个小数?不同的货币有不同的小数位数和规则来管理舍入和转换。使用整数根本不是一个好主意。我不会说
money
smallmoney
decimal
一起工作“也很好”,例如,对于包含美分的大量金融操作,您甚至不能使用
SUM()
,因为实际值和显示值之间可能存在差异,但是我同意你答案的基础,因为很多原因,最好的方法就是使用我刚刚测试过的
decimal(18,4)
,如果你不显式地将
int
除以
int
,结果就是
int
。@Irakli Gigiberia:你说得对。我把答案改了一点。