8

我正在使用以下代码将数据表批量插入到我的 SQL 表中:

 // Set up the bulk copy object.  
                using (SqlBulkCopy bulkCopy =
                           new SqlBulkCopy(destinationConnection.Connection))
                {
                    bulkCopy.DestinationTableName =
                        Constants.ReportDataTable;

                    // Write from the source to the destination.
                    DataTable dtBulk = GetDatatableInReportDataFormat(dt, objectName, version);
                    bulkCopy.WriteToServer(dtBulk);//To get the Datatable in the SQL table format

                }

我的 SQL 表中有一个名为“Value”的列,它的类型是十进制 (28,5)。我的问题是一些带有十进制数字的值被自动四舍五入,因此我失去了精确度,例如一个值0.72768被保存为0.72767.

在数据表中,“值”列的类型为 Double。

任何机构有一个想法?谢谢

4

2 回答 2

8

使列中的DataTableasdecimal而不是double……我强烈怀疑这会使问题消失。

于 2013-06-30T14:34:42.973 回答
3

double 的十进制精度不是固定的,即使它是 128 位 double 或更高。所以这不是“舍入错误”。简单地说,双精度数不能保证代表有限小数点范围内的所有实数。当尝试存储更大的数字或非常接近于零的数字时,这种精度损失会进一步增加。

http://en.wikipedia.org/wiki/Double-precision_floating-point_format

如果您要存储需要保证十进制精度的实数,例如货币值、经度/纬度或类似值,则将它们存储为十进制类型。

更新:实际上,如果您存储非常大的数字,则双精度(或单/浮点)没有固定精度,那么将有您无法表示的整数,因为精度损失并且如果计算应该导致这样的值,那么最接近的可表示整数将是而是计算和存储。

于 2013-10-15T13:02:29.280 回答