从 C# 到 SQL Server 的精度损失
本文关键字:精度 损失 Server SQL | 更新日期: 2023-09-27 17:56:08
这是我
面临的一个问题,在从C#实体框架存储在SQL Server数据库中时会导致精度损失。
- SQL Server 数据类型为
decimal(20, 15)
- 在 C# 中,属性定义为
public decimal AssignedGrossBudget { get; set; }
- 在 C# 中,变量 (分配的总预算) 中的值为 34.09090909090909
- 但在 SQL Server 表中它是 34.0900000000000000
可能出了什么问题?(我正在使用实体框架数据库。保存更改();和SQLBulkCopy,用于将数据从c#存储到SQL Server)
我想存储 34.09090909090909 而不是 34.0900000000000000
。我通过直接插入表格进行了检查,它可以工作。
谢谢乌里尔和莱姆斯。
我在实体框架中进行了如下更改:
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);
}
}
}
因此,我必须得出结论,问题出在您的代码上,该代码未发布。