从 C# 到 SQL Server 的精度损失

本文关键字:精度 损失 Server SQL | 更新日期: 2023-09-27 17:56:08

这是我

面临的一个问题,在从C#实体框架存储在SQL Server数据库中时会导致精度损失。

  1. SQL Server 数据类型为 decimal(20, 15)
  2. 在 C# 中,属性定义为public decimal AssignedGrossBudget { get; set; }
  3. 在 C# 中,变量 (分配的总预算) 中的值为 34.09090909090909
  4. 但在 SQL Server 表中它是 34.0900000000000000

可能出了什么问题?(我正在使用实体框架数据库。保存更改();和SQLBulkCopy,用于将数据从c#存储到SQL Server)

我想存储 34.09090909090909 而不是 34.0900000000000000

我通过直接插入表格进行了检查,它可以工作。

从 C# 到 SQL Server 的精度损失

谢谢乌里尔和莱姆斯。

我在实体框架中进行了如下更改:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<StationMapping>().Property(x => x.AssignedGrossBudget).HasPrecision(35, 15);
        }

对于SQL批量复制,我根据Remus的建议添加了数据类型。

SpotLookupTable.Columns.Add(new DataColumn("GrossBudget",typeof(decimal)));

它现在正在工作,没有损失(或可忽略不计)。

干杯

一个简单的例子表明,正确编写的代码不会发生这种精度损失:

    static void Main(string[] args)
    {
        decimal d = 34.09090909090909M;
        Console.WriteLine(d);
        SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();
        scsb.IntegratedSecurity = true;
        scsb.DataSource = @".'sql2012";
        using (SqlConnection conn = new SqlConnection(scsb.ConnectionString)) {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(
               "select cast(@d as DECIMAL(20,15))", conn))
            {
                cmd.Parameters.AddWithValue("@d", d);
                decimal rd = (decimal) cmd.ExecuteScalar();
                Console.WriteLine(rd);
            }
        }
    }

因此,我必须得出结论,问题出在您的代码上,该代码未发布。