C#将金钱的小数转换为整数

问题描述 投票:1回答:2

我有一个(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; } 
   }
}

这是个好主意吗?

c# .net sql-server entity-framework
2个回答
2
投票

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

float不同,小数位数非常适合存储货币金额。 SQL Server还具有money数据类型(moneysmallmoney),它们也可以很好地工作,但是在进行数学运算时需要格外小心。


-1
投票

我将继续使用decimal。如果必须计算分数,则int / int将以double结尾。

© www.soinside.com 2019 - 2024. All rights reserved.