문제

나는 여기에 이상한 문제가 있습니다. 열에 저장된 값이 큰 데이터베이스 테이블이 있습니다. 내 응용 프로그램 (C#) 은이 값을 읽고 더블 유형. 이 응용 프로그램은 다른 테이블에 동일한 값을 삽입합니다. 참고 : 첫 번째 테이블에서 읽은 값에 대해 계산/처리를 수행하지 않습니다. 두 번째 테이블을 업데이트하기 위해 유지됩니다.

여기서 문제는 두 번째 테이블이 첫 번째 테이블과 약간 다른 값을 얻는 것입니다. 이중 유형을 보관할 때 숫자가 반올림하는 것 같습니다.

다음은 값의 예입니다.

원래 가치 : 18014398509481984

새 테이블에 복사 된 값 : 18014398509482000

값은 다르게 보이지만 실제로는 모두 동일합니다. Google 검색을했습니다 18014398509481984 - 18014398509482000 검색어로서 결과를 반환했습니다 0, 둘 다 동일하다는 것을 의미합니다.

질문:

1- 둘 다 동일하다면 두 번째 값이 다르게 보이는 이유는 무엇입니까? 나는 볼 수있다 1984 로 전환 2000.

2- 변환이 발생하는 이유는 무엇입니까?

3- 이러한 유형의 전환을 어떻게 피할 수 있습니까?

어떤 도움이든 좋을 것입니다!

도움이 되었습니까?

해결책

a를 사용해보십시오 System.Decimal 첫 번째 테이블에서 값을 저장하려면 System.Double. System.Double 그 큰 값을 정확하게 저장하기에 충분한 숫자를 포함하지 않는 것 같습니다.

다른 팁

이중 정밀 값은 15 또는 16 자리수로 정확합니다 ( 여기 설명을 위해). 이보다 더 많이 저장 해야하는 경우 다른 번호 형식을 사용해야합니다. 정확성을 잃지 않고 매우 큰 정수로 작업하고 싶다면 좋아하는 데 도움이되는 다양한 수업이 있습니다. 이 하나.

SQL에서 값을 얻는 경우, .NET 일치하는 대상 데이터 유형 - C# Long의 SQL Bigint에서 이와 같은 반올림을 피하십시오.

나는 이것이 부동 소수점 정밀성 때문이라고 생각합니다 (많은 수는 Mantissa를 지수를 사용합니다). 이는 본질적으로 전원이있는 진영 수로 표현 될 것임을 의미합니다. 그러나 분수 숫자는 부동 소수점 산술로 인한 반올림 오류가 발생합니다.

일반적으로 이것은 플로팅 포인트 값 (int64를 시도)을 피하거나보다 정확한 유형 (소수)을 사용하거나 오류를 설명하고 '대략 같은'을 수행하는 것입니다.

이를 부동 소수점 번호로 저장해야합니까?

그렇지 않다면 대신 64 비트 정수를 사용할 수 있습니다. BIGINT 데이터베이스에서 long/Int64 앱에서.

이 범위는 –9,223,372,036,854,775,808까지 최대 9,223,372,036,854,775,807이며 정밀/정확도 문제가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top