【问题标题】:Money in SQL ServerSQL Server 中的钱
【发布时间】:2011-03-30 15:15:25
【问题描述】:

我使用实体框架作为 ORM 和 Sql Server 2008 作为服务器。

我的应用中有财务操作,因此我使用了金钱列。但是当结果是例如 2.99986 时,它存储在数据库值 2.9998 中,而期望值是 2.9999。

是否有任何选项可以让它像数学所说的那样工作,如果没有,我如何在 C# 中对数字进行四舍五入,以便 Math.Round(2.99986) 给出的结果为 2.9998,只需在第 4 次之后削减其余的 sigits地点。

感谢您的帮助

我想出的唯一解决方案是将我的数字乘以 10000,然后将其截断,然后除以 10000 :) 还有其他更好的解决方案吗?

【问题讨论】:

  • 通常在执行财务计算时需要尽可能高的精度。为什么要less
  • 因为您通常不需要精确度,而需要准确度。您在整个企业中都采用同样的方法,否则您会遇到令会计师头晕目眩的四舍五入错误。如果另一个系统正在跟踪类似的数字,精确到小数点后 4 位,您只需以相同的方式进行操作即可避免令人头疼的问题。
  • hello 之后的第二段和第三段有冲突。第二个说想要的是 2.9999。第三个说期望是 2.9998。编辑(最后一段)说期望是 2.9998。

标签: c# .net sql-server entity-framework-4


【解决方案1】:

这是数据类型的限制。看起来它会截断小数点右侧第 4 位之后的任何内容。

来自 MSDN - Using Monetary Data:

如果一个对象被定义为货币,它最多可以包含 19 位数字,其中 4 位可以在小数点的右边。该对象使用 8 个字节来存储数据。因此,money 数据类型的精度为 19,比例为 4,长度为 8。

还有:

money 和 smallmoney 限制为小数点后四位。如果需要更多小数点,请使用十进制数据类型。


更新:

从您的 cmets 看来,您希望在 C# 中解决此问题。在这种情况下,您可以使用 Math.Round 重载之一,该重载采用适合您需要的舍入逻辑的 MidpointRounding 枚举。

【讨论】:

  • 我不需要更多的小数点。我只想知道在舍入数字 2.9998 后使用什么方法在 C# 表单数字 2.99986
【解决方案2】:

使用它来有效地截断所需的精度

 Math.Round(value - 0.00005, 4, MidpointRounding.AwayFromZero));

【讨论】:

    猜你喜欢
    • 2015-05-06
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2012-09-21
    • 2023-03-16
    • 2018-01-29
    相关资源
    最近更新 更多