【问题标题】:Mapping Float with NHibernate使用 NHibernate 映射浮点数
【发布时间】:2013-07-23 14:17:56
【问题描述】:

我有一个使用 nhibernate 和 fluent-nhibernate 的应用程序。我们使用的是 SQL Server 2008,我有一个带有浮点列的表,因为我们没有固定的精度,用户可以设置任意数量的小数位(1、10、25 位小数等)。我像这样使用 fluent-nhibernate 映射它:

Map(x => x.Factor).Column("FACTOR").Not.Nullable();

我也试过了:

Map(x => x.Factor).Column("FACTOR").Precision(53).Not.Nullable();

还有这个:

Map(x => x.Factor).Column("FACTOR").CustomSqlType("float").Not.Nullable();

它不起作用。看我的数据库截图:

字段因子是我的浮点列,最后一个注册表的数字为1,234567891,当nhibernate 在数据库上查询时,它在C# 中带有1,123456788,C# 正在对值进行四舍五入。我们需要原始值。

我怎样才能让它工作?

【问题讨论】:

  • 您的数据库列定义?
  • 我在sql server上的专栏是float.
  • Map(x => x.Factor).Column("FACTOR").Scale(53).Precision(54).CustomSqlType("float").Not.Nullable();跨度>
  • 我认为问题在于 db 上的浮点数...您应该使用小数...
  • 我会尝试,但是decimal 类型有多少位小数?

标签: c# nhibernate floating-point fluent-nhibernate


【解决方案1】:

是的,在数据​​库中使用十进制,浮点数会有rounding 遇到的问题。 在域类中也使用小数,因为浮点/双精度都存在相同的舍入问题。

地图使用:

Map(x => x.Factor).Column("FACTOR").CustomSqlType("decimal(p,s)").Not.Nullable();

这应该转换为decimal in sql server。

【讨论】:

  • Alex,感谢您提供的遮阳篷,但是,如何配置 Precision 和 Scale 以获得小数的最大值?我的意思是,整数和小数位数的最大值。
  • 通过更改 (p,s)。 p 是小数的总长度(以数字为单位),s 是小数位数。但是这个映射将是永久的——它应该是——它是数据库模式!它不应该在完成的应用程序中经常更改。如果您想在每一行中具有任意精度,这不是我认为 SQL 标准打算提供的,您可以将值编码为比特流并存储一个字节 []。但是,祝你好运:)
  • 谢谢 Alex,你知道吗,我可以在 Oracle 数据库中创建什么列类型以使其正常工作。在sql server中我用decimal (29,14)和oracle解决?我试过number(29,14),但不起作用!
  • 我的 Oracle 经验有限,但他们似乎使用 decimal。另见here。
猜你喜欢
  • 2011-12-17
  • 2012-01-04
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多