2016-11-04 4 views
1

double (또는 float)을 decimal으로 변환 할 때 오버플로 예외가 발생할 수 있습니다. 그래서 포화하여이 방지이 작은 확장 메서드를 작성했습니다 :double에서 decimal로 변환 할 때 오버플로 오류 방지

public static decimal ToDecimalSafe(this double input) 
{ 
    try 
    { 
     return (decimal)input; 
    } 
    catch (OverflowException) 
    { 
     if (input < 0) 
      return decimal.MinValue; 
     else 
      return decimal.MaxValue; 
    } 
} 

문제는,이 오버 플로우는 "예외가 뛰어난해야한다"가이드 라인을 깨고, 내 유스 케이스에 꽤 자주 발생합니다. 응용 프로그램 속도가 느려지지만 그래도별로 중요하지 않습니다. 진짜 문제는 디버깅 중에 많은 첫 번째 예외가 발생하여 성가신 일입니다. 여기에 두 번째 시도가 잘 작동하는 것 같습니다.

public static decimal ToDecimalSafe(this double input) 
{ 
    if (input < (double)decimal.MinValue) 
     return decimal.MinValue; 
    if (input > (double)decimal.MaxValue) 
     return decimal.MaxValue; 

    try 
    { 
     return (decimal)input; 
    } 
    catch (OverflowException) 
    { 
     if (input < 0) 
      return decimal.MinValue; 
     else 
      return decimal.MaxValue; 
    } 
} 

나는 몇 가지 가능한 가장자리 케이스를 잡으려고 try-catch를 남겼습니다. 질문은 여기에 있습니다 : 어떤 엣지 케이스가 있습니까? 아니면 그냥 try-catch를 생략 할 수 있습니까?

double>= (double)decimal.MinValue<= (double)decimal.MaxValue 일 수 있으며 변환시에도 여전히 오버플로가 발생합니까?

+0

처음에는 'double'대신 'decimal'을 사용하는 이유는 무엇입니까? 당신이 옳은 일이 아닌 재정적 인 것보다는 엔지니어링이나 과학적인 계산에'십진법 '을 사용하는 것처럼 들립니다. –

+0

@MatthewWatson 그것은 고정밀도가 아닙니다. double 형을 다루는 하드웨어와 사용자가 제공하고 십진수를 사용하는 설정 사이에서 상호 작용하는 것입니다. 하드웨어는 한계를 제공하는데, 사용자가 어쨌든 신경 쓰지 않는 범위가 종종 있습니다. –

+0

@MatthewWatson "상당히 자주"는 초당 1000 회를 의미하지는 않습니다. 설정 한계를 잡으면 총 100 회를 의미합니다. –

답변

1

예외가 더 이상 발생하지 않습니다. 이 방법으로 코드를 수정할 수 있습니다.

public static decimal ToDecimalSafe(this double input) 
{ 
    if (input < (double)decimal.MinValue) 
     return decimal.MinValue; 
    else if (input > (double)decimal.MaxValue) 
     return decimal.MaxValue; 
    else 
     return (decimal)input; 
} 

그때 살펴보고 제안 또한 특정 변환 방법을 사용할 수 있지만 문제는 성가신 단지 디버깅 휴식 경우는 예외

Convert.ToDecimal

을 방지하지 않습니다 [DebuggerStepThrough] 또는 [DebuggerHidden] 속성

+0

그 속성에 대해 전혀 몰랐습니다. 굉장히 유용하다. BTW, 난 그냥 실제로 나 자신에 의해 이것을 알아 내려고 노력하고 몇 분을 보냈다. 그리고 decimal.MinValue (double) decimal.MaxValue를주는 것은 예외를 발생시킨다. 비교를 포함하여 (<= and > =) 문제를 해결하지만 경계 내에서 약간 충돌하는 값을 찾는 방법을 찾아야합니다. –