Dot-Net

使用 SqlBulkCopy 將記錄批量插入 SQL 時精度失去

  • January 26, 2016

我正在使用以下程式碼將數據表批量插入到我的 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。

任何機構有一個想法?感謝

使列中的DataTableasdecimal而不是double……我強烈懷疑這會使問題消失。

double 的十進制精度不是固定的,即使它是 128 位 double 或更高。所以這不是“舍入錯誤”。簡單地說,雙精度數不能保證代表有限小數點範圍內的所有實數。當嘗試儲存更大的數字或非常接近於零的數字時,這種精度損失會進一步增加。

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

如果您要儲存需要保證十進制精度的實數,例如貨幣值、經度/緯度或類似值,則將它們儲存為十進制類型。

更新:實際上,如果您儲存非常大的數字,則雙精度(或單/浮點)沒有固定精度,那麼將有您無法表示的整數,因為精度損失並且如果計算應該導致這樣的值,那麼最接近的可表示整數將是而是計算和儲存。

引用自:https://stackoverflow.com/questions/17391386