2011-02-18 5 views
5

십진법 데이터 형식을 사용하여 SQL Server 데이터베이스에 재무 데이터를 저장하므로 십진수로 6-8 자리의 정밀도가 필요합니다. 이 값을 데이터 액세스 레이어를 통해 C# 서버로 다시 가져 오면 10 진수 데이터 유형으로 되돌아갑니다.C에서 십진수로 안전하게 변환하는 방법 #

내 통제 범위를 벗어나는 일부 설계 제약으로 인해이를 변환해야합니다. 문자열로 변환하는 것은 문제가되지 않습니다. 이중으로 변환하는 것은 MS 설명서에서 "[십진법에서 이중으로 변환]은 배정 밀도 부동 소수점 숫자가 십진수보다 소수이기 때문에 반올림 오류가 발생할 수 있습니다."

계산이 완료된 후 double (또는 문자열)을 소수점 이하 2 자리로 반올림 할 수 있으므로 소수점 이하 변환을 수행하여 "반올림하기 전에 어떤 정밀도도 잃지 않도록하십시오" ?

+2

MSDN에 따르면 decimal은 28-29 자리의 정밀도를, double은 15-16을가집니다. 그러나 6-8 자리 만 저장하고 있다면 반올림이 영향을 미치지 않을 것이라고 생각합니다. 이것은 쉽게 단위 테스트를 통해 확인할 수 있습니다. – nithins

답변

13

변환은 처음 8 자리 내에 오류를 생성하지 않습니다. double은 15-16 자리의 정밀도를 가지고 있습니다. 즉, decimal의 28-29보다 작지만 소리로는 충분합니다.

미래에 double을 사용하지 않으려면 반드시 계획을 세워야합니다. 재무 계산에는 부적절한 데이터 유형입니다.

+1

15 초 내 의견을 이길! (+1) :) – nithins

+0

* "재무 계산에 부적합한 데이터 유형입니다."* 여가 시간에이 점에 대해 자세히 설명해 주시겠습니까? 그것은 내가 항상 "알았던"것들 중 하나이며 꼭 이해할 필요는 없습니다. 건배! :) –

+6

@djacobson : 재무 계산은 대개 소수 *로 표현됩니다 * 0.01과 0.01을 추가 한 결과가 * 정확히 * 0.02라고 예상합니다. 그것은 0.01와 0.02가 정확하게 표현 될 수없는'double'에서 트릭입니다. 물론, 당신이 (3)으로 나누면 몇 가지 정보를 잃을 것입니다 ... 그러나 우리는 모두 10 진수 연산에 익숙하기 때문에 모든 사람들이 이해하기 쉽고 (아마도 정책을 결정할 것입니다). 일반적으로 신장과 체중과 같은 자연적으로 부정확 한 양은 두 배에 좋습니다. 정확한 인조 물량은 소수점에 좋습니다. –

3

2dp로 반올림 한 경우 IMO는 "올바른"방법은 배수 인 정수를 저장합니다. 즉 1234에 대해 정수 1234를 저장합니다. 더 이상 이중으로 반올림하지 않아도됩니다.

두 번 사용해야하는 경우에도 여전히 작동합니다. 모든 정수가 정확히 두 배로 저장된다는 보장을받습니다. 따라서 동일한 트릭을 사용하십시오.

+0

조기 최적화로 간주되는 int를 double로 저장하지 않겠습니까? 1. 당신은보기, 업데이트 및 저장에서 전환을 기억해야합니다. 2. 비즈니스 요구 사항이 변경되면 큰 문제가 발생합니까? 나중에 재무 부서에서 소수점 4 자리를 원하면 어떻게 될까요? – Holystream

+0

또한 이것을 사용하여 최대/최소 숫자를 2 자리 씩 줄입니다. 따라서 +/- 2Billions 대신에 이제는 +/- 20 백만 개 밖에 없습니다. 예, Int64를 사용할 수는 있지만 지금은 무엇입니까? – Holystream

+0

@Holystream : "정수"로 "Int32"를 의미하지 않는다고 생각합니다. 나는 그가 "정수"를 의미한다고 생각한다. 대부분의 오래된 시스템은'Int64' 나'Decimal'을 지원하지 않았지만 정밀도를 잃지 않고 4,503,599,627,370,496까지의 모든 정수를 수용 할 수있는'Double'을 지원했습니다 (또는 100의 배율로 모든 페니가 위로 올랐습니다) ~ $ 45,035,996,273,704.96) – supercat

관련 문제