问答中心分类: C#在 C# 中用于赚钱的最佳数据类型是什么?
0
匿名用户 提问 21分钟 前

在 C# 中用于赚钱的最佳数据类型是什么?

ntombela 回复 21分钟 前

你可能会从中找到答案post有帮助。

ntombela 回复 21分钟 前

这是所有数据类型的映射:learn.microsoft.com/en-us/dotnet/framework/data/adonet/…

ntombela 回复 21分钟 前

此外,如果使用数据注释,包括using System.ComponentModel.DataAnnotations;[DataType(DataType.Currency)] msdn.microsoft.com/en-us/library/…

8 Answers
0
David Walschots 回答 21分钟 前

System.Decimal

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 。

0
lmsasu 回答 21分钟 前

使用金钱模式企业应用架构模式.将金额指定为小数,将货币指定为枚举。

Thomas Owens 回复 21分钟 前

我实际上打算这样做,但我将 Currency 设为一个类,以便我可以定义汇率(相对于“基础货币”,通常是美元 [我将汇率设置为 1.00])。

Korijn 回复 21分钟 前

对于这个线程的未来访问者(比如我),现在有这个:nuget.org/packages/Money它摇摆不定!

nawfal 回复 21分钟 前

想知道这样的类型应该是结构还是类。十进制 + (int) 枚举使其为 20 个字节。我的钱还在 struct 上。

George Mauer 回复 21分钟 前

Moneynuget 有一个项目站点的死 github 链接,所以……没有文档?

George Mauer 回复 21分钟 前

这样做的问题是,如果您要创建自己的实现,则必须弄清楚如何实际持久化它。而且最流行的 ORM (EF) 根本不支持自定义数据类型。因此有人被要求得到真的在杂草深处做些什么应该是一件很简单的事情。

0
SquidScareMe 回答 21分钟 前

十进制。如果您选择双精度数,您将面临舍入错误

Ian Boyd 回复 21分钟 前

@杰斯double可能会引入舍入误差,因为浮点数不能准确地表示所有数字(例如 0.01 在浮点数中没有准确的表示法)。Decimal, 另一方面,代表数字确切地. (权衡是Decimal范围比浮点小)浮点会给你*无意*舍入错误(例如0.01+0.01 != 0.02)。Decimal可以给你舍入错误,但只有当你要求它时(例如Math.Round(0.01+0.02)返回零)

supercat 回复 21分钟 前

@IanBoyd:值“$1.57”可以精确表示(双)157。如果一个使用double并在适当的时候仔细应用缩放和特定领域的舍入,它可以非常精确。如果一个人四舍五入马虎,decimal可能会产生语义不正确的结果(例如,如果将多个值相加,这些值应该四舍五入到最接近的一美分,但实际上并没有首先围绕它们)。唯一的好处是decimal是缩放是内置的。

sawe 回复 21分钟 前

@supercat,关于这条评论“如果一个人将多个值加在一起,这些值应该四舍五入到最接近的一分钱,但实际上并没有首先围绕它们”,我看不出浮点数如何解决这个问题。这是一个用户错误,与小数恕我直言无关。我确实明白这一点,但我觉得它放错了地方,主要是因为 IanBoyd 确实指定了……如果你要求的话。

0
dommer 回答 21分钟 前

小数的范围更小,但精度更高 – 所以你不会随着时间的推移失去所有这些便士!
完整的细节在这里:
http://msdn.microsoft.com/en-us/library/364x0z75.aspx

0
Lennaert 回答 21分钟 前

同意货币模式:使用小数时处理货币太麻烦了。
如果你创建一个 Currency 类,你可以把所有与钱相关的逻辑放在那里,包括一个正确的 ToString() 方法,更多的解析值控制和更好的分割控制。
此外,使用 Currency 类,不可能无意中将钱与其他数据混在一起。