【问题标题】:Save adding extra decimal places保存添加额外的小数位
【发布时间】:2012-04-16 16:52:56
【问题描述】:

我有一个定义为十进制(9,9)的数据库字段。 C# 中的 edmx 模型将此字段映射到精度和小数位数为 9 的十进制变量。

我将数字 5 放入变量中。我可以检查的所有地方都将值显示为 5(在局部变量、实体类实例、数据上下文等中)。

DataContex.SaveChanges() 时,该值转换为“5.000000000”。尽我所能告诉实体框架在尝试保存到数据库之前将值添加 9 个小数位。这会导致错误,因为该值现在的位数太多。

有谁知道导致这种行为的原因以及如何改变它?

附加信息 - 我首先在 Microsoft SQL 2008 R2 中创建我的数据库。然后我从数据库中生成了实体框架模型。

【问题讨论】:

  • 您是否将 5 保存为字符串?还是作为小数?还是整数?
  • 在程序中我输入了一个值 5.0。检查变量会在 Visual Studio 中显示“十进制”值 5。
  • @abatishchev 如果你说的是数字文字,那么 5.0 是双精度的,但 5.0m 是十进制的。
  • @phoog:感谢指正。你是对的。

标签: c# .net entity-framework decimal savechanges


【解决方案1】:

如果您确实在数据库中将数据类型定义为decimal(9,9),那么您就有问题了。
根据Microsoft,第一个数字是总位数,第二个是小数点右边的位数。
所以你真的只能在这样的字段中存储小于 1 的数字,格式为.123456789。 如果需要存储 5 个,则需要不同的格式。

【讨论】:

  • 引用页面将值列为“最大”值,我将其视为可能的限制,而不是所需的数量。我将其更改为“十进制(9,4)”,一切正常。我将您的回复标记为答案。谢谢。
  • 是的,这样看参考页是模棱两可的,但是在 SQL 中,十进制确实是定点类型(相对于 C# 的小数,它更灵活)。
【解决方案2】:

这不是实体框架所特有的,而是预期用于精度定义为 9 的小数(映射回您的数据库)。所以,当你输入 5 时,由于数据的定义方式,小数点后面会加上 0。

这是在 .NET 1.1 中实施的,以符合标准(我忘记是哪个标准了)。出于显示目的,您始终可以使用 Math.Round 来移除精度级别(或根据您的实际需要以不同方式定义数据)。

【讨论】:

  • 精度级别已经在 C# 中四舍五入。保存时添加额外的数字(小数点右侧)。在 C# 中我无法删除任何内容,因为该值仅显示为 5(没有小数点或多余的数字)。
  • @JeremyLund - 您可以通过以下链接中的信息覆盖精度:stackoverflow.com/questions/3504660/…。我不直接知道您的评论的答案,因为我从未遇到过这种特定情况。
  • 感谢您的建议,但我首先使用的是模型,并且模型已经包含与数据库匹配的精度和比例 (9,9) 的正确属性。这就是为什么我对它超出了定义的精度和规模感到困惑。
  • 为了显示,最好使用格式字符串而不是 Math.Round
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多