我使用以下代码批量将数据表插入到我的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
。
在Datatable中,“Value”列的类型为Double。
任何团体都有想法?感谢
答案 0 :(得分:8)
将DataTable
中的列设为decimal
而不是double
...我强烈怀疑这会使问题消失。
答案 1 :(得分:3)
double的小数精度不固定,即使它是128位或更高。所以这不是“舍入错误”。简单地说,双倍不能保证代表有限小数点范围内的所有实数。当试图存储非常接近零的更大数字或数字时,这种精度损失会增加得更多。
http://en.wikipedia.org/wiki/Double-precision_floating-point_format
如果您要存储需要保证十进制精度的实数,如货币值,经度/纬度或类似值,则将它们存储为十进制类型。
一个uppdate:实际上没有使用double(或单个/ float)修复精度,如果你存储了很大的数字,那么就会出现你无法表示的整数,因为精度会损失,如果计算得到这样的值那么最接近可表示将计算并存储整数。