Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 小数位数舍入不正确-这是LINQ到SQL错误吗?_C#_Sql Server_Linq To Sql_Rounding - Fatal编程技术网

C# 小数位数舍入不正确-这是LINQ到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 {

我的数据库字段(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
        {
            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()可以用于此属性,但我有很多这样的方法
更新2

这也不起作用,它在提交更改之前进入这段代码,并且似乎起作用,但是生成的更新sql仍然具有截断值,而不是更新的舍入值

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);
}