在SQL Server 2012 Decimal列中插入double会导致不精确

eek*_*142 0 c# sql-server double decimal sql-server-2012

在从C#到SQL服务器没有任何不精确的情况下,让程序插入实际数字会遇到很多麻烦.

例如,以下是在推送到SQL Server之前如何在C#中处理数据的代码:

DataTable dt = new DataTable();
dt.Columns.Add("Number", typeof(double));

dt.Rows.Add(6.5);
dt.Rows.Add(7);
dt.Rows.Add(8);

SqlConnection con;
string sqlCmd;
SqlCommand cmd;

using (con = new SqlConnection(Common.DBLink))
{
                con.Open();
                SqlBulkCopy bulkCopy = new SqlBulkCopy(con);
                bulkCopy.DestinationTableName = "NumberTable";
                bulkCopy.WriteToServer(dt);
                con.Close();
}
Run Code Online (Sandbox Code Playgroud)

但如果我有一个像2.85这样的数字,它会被插入为2.8499.SQL列是一种DECIMAL(10,4)数据类型.这只发生在很少的数字上.对于像12.5或20这样的值,它永远不会发生.

Gra*_*ICA 5

如果您需要一个decimal值,请不要将其存储double在您的DataTable.

将列类型更改为a decimal并再次尝试:

dt.Columns.Add("Number", typeof(decimal));
Run Code Online (Sandbox Code Playgroud)

你可以通过搜索"c#double vs decimal"找到很多有用的信息,例如这篇SO帖子,或Jon Skeet关于小数双打的文章.