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:你说得对。我把答案改了一点。