在 SQL Server 2012 十进制列中插入双精度会导致不精确

本文关键字:双精度 不精确 插入 Server SQL 2012 十进制 | 更新日期: 2023-09-27 18:33:43

在让程序插入实际数字而没有任何不精确的情况下从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();
}

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

在 SQL Server 2012 十进制列中插入双精度会导致不精确

如果您需要decimal值,请不要将其作为double存储在DataTable中。

将列类型更改为decimal,然后重试:

dt.Columns.Add("Number", typeof(decimal));

你可以通过搜索"c#双精度与十进制"找到很多有用的信息,比如这篇SO帖子,或者Jon Skeet关于小数和双精度的文章。