C# 小数位数舍入不正确-这是LINQ到SQL错误吗?
我的数据库字段(sql server 2005)是用数字(15,2)定义的 LINQ 2 SQL生成的属性为C# 小数位数舍入不正确-这是LINQ到SQL错误吗?,c#,sql-server,linq-to-sql,rounding,C#,Sql Server,Linq To Sql,Rounding,我的数据库字段(sql server 2005)是用数字(15,2)定义的 LINQ 2 SQL生成的属性为 [Column(Storage="_My_Property_Name", DbType="Decimal(15,2)", UpdateCheck=UpdateCheck.Never)] public System.Nullable<decimal> My_Property_Name { get {
[Column(Storage="_My_Property_Name", DbType="Decimal(15,2)", UpdateCheck=UpdateCheck.Never)]
public System.Nullable<decimal> My_Property_Name
{
get
{
return this._My_Property_Name;
}
set
{
if ((this._My_Property_Name != value))
{
this.OnMy_Property_NameChanging(value);
this.SendPropertyChanging();
this._My_Property_Name = value;
this.SendPropertyChanged("My_Property_Name");
this.OnMy_Property_NameChanged();
}
}
}
正如你所看到的@p9=23.63,我希望它是23.64
更新
我的问题是,
如果这是一个LINQtoSQL错误,我希望它是一个已知的错误,我会在哪里找到它是否有保留的错误列表?
还有什么是最好的解决方法?
- 我猜将字段更改为15,3并不能修复该错误,它只会将其移到小数点后1位
- 重写OnMy_属性_NameChanged()可以用于此属性,但我有很多这样的方法
partial void OnMy_Property_Name_ChangingChanging(decimal? value)
{
if (!value.HasValue)
{
return;
}
value =
Math.Round(value.Value, 2, MidpointRounding.AwayFromZero);
}
我目前的解决方案是直接更新实体值。说:
默认设置为十进制和货币类型
SQL Server十进制类型的精度
(左、右各18位小数)
小数点的右边)是很多
小于CLR的精度
与之配对的十进制类型
违约这可以提高精度
将数据保存到数据库时丢失
数据库然而,恰恰相反
如果SQL Server十进制
类型配置为大于
29位精度。当一个SQL
已删除服务器十进制类型
以更高的精度配置
比CLR系统。十进制,精度
检索数据时可能会发生丢失
从数据库中
您可以通过重写
OnMy\u Property\u NameChanged()
并在那里取整来处理此问题。确保指定了正确的舍入模式(到偶数或从零开始)。这似乎是LINQ的错误。您需要将DBType从Decimal(15,2)
更改为Decimal(15,3)
。这比数据库中的列精度增加了1个精度。在我看来,指向SQL的链接将值截断为小数点后2位,而不是四舍五入 如果我直接用23.6363更新数据库,那么它将变为23.64。。。。没关系。如果我重写该属性,那么它将修复该属性,但它是一个包含大量15,2个已定义字段的大型数据库。。。我真的不想为他们所有人这样做。我会想,如果这是一个LINQ2SQL错误,它以前会被发现吗??(感谢您的回答)如果您对此有信心,我建议您使用reflector深入研究linq2sql内部。很明显,这是关于查询生成器的,但是如果我们使用自动数据库创建,那么该列将被创建为(15,3)。
partial void OnMy_Property_Name_ChangingChanging(decimal? value)
{
if (!value.HasValue)
{
return;
}
value =
Math.Round(value.Value, 2, MidpointRounding.AwayFromZero);
}