SqlBulkCopy를 사용하여 대량 레코드를 SQL에 삽입하는 동안 정밀도가 손실 됨

.net bulkinsert sql sqlbulkcopy sql-server-2008

문제

내 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 테이블에 열이 있습니다. 유형은 10 진수 (28,5)입니다. 내 문제는 소수 몇 가지 값이보기 자동 따라서 나는의 값 예를 들어 precison, 상실하고, 반올림되고 있다는 점이다 0.72768 로 저장되는 0.72767 .

Datatable에서 "Value"열은 Double 유형입니다.

어떤 시체에 아이디어가 있습니까? 감사

수락 된 답변

DataTable 의 열을 double 아닌 decimal 로 만듭니다. | 제가 강하게 의심되면이 문제가 사라집니다.


인기 답변

double의 십진수 정밀도는 128 비트 double 이상이라도 고정되어 있지 않습니다. 따라서 "반올림 오류"가 아닙니다. 단순히 double이 제한된 소수점 범위 내의 모든 실수를 나타내는 것은 아닙니다. 이 정밀도의 손실은 더 큰 수 또는 0에 매우 가까운 수를 저장하려고 할 때 훨씬 더 증가합니다.

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

화폐 값, 경도 / 위도 또는 이와 유사한 10 진수 정밀도에 대한 보장이 필요한 실수를 저장하는 경우 십진수 형식으로 저장하십시오.

uppdate : 실제로 큰 정밀도를 저장하지 않으면 정밀도가 double (또는 single / float)으로 고정되지 않습니다. 그러면 정밀도를 잃어 버릴 수 있으므로 표현할 수없는 정수가됩니다. 계산에서 이러한 값이 나오면 가장 가까운 대표 정수가됩니다. 대신 계산 및 저장됩니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.