2012-09-01 6 views
0

저는 현재 다음 값을 리턴하는 방법을 가지고 있습니다. 예를 들어 항목 가격이 $ 350,000이고 퍼센트가 7 %이면 24,500을 반환합니다.계산이 MaxValue를 초과하는지 확인하십시오.

public static decimal GetPercentValue(decimal? percentage, decimal baseValue) 
    { 
     decimal result = 0m; 

     if (percentage != null) 
     { 
      try 
      { 
       result = Convert.ToDecimal(baseValue * percentage/100m); 
      } 
      catch (OverflowException) 
      { 
       result = 0; 
       Logger.Warn("OverflowException caught in GetPercentValue() - should better be handled UI-Sided!"); 
      } 
     } 

     return result; 
    } 

나는 올바른 방법으로 처리되지 않는다고 생각합니다. 따라서이 상황에서 예외를 피할 수있는 방법이 있습니까?

사용자가 999,999,999,999,999,999과 같은 미친 번호를 입력하고 9999999999%을 계산할 때 OverflowException이 throw됩니다. 이 방법은 에 대한 percentage 또는 baseValue을 확인할 수 없습니다. 계산 결과 자체가 소수점 이하를 초과합니다.

+0

'나는 이것이 올바른 방향으로 다루어 져야한다고 생각하지 않는다.'- 어떻게 의미하니? 올바른 방법이 어떠해야한다고 생각하는지는 명확하지 않습니다. – Oded

+0

79228162514264337593543950335 인 최대 값을 초과하는 경우 어프로치를 재고하고 싶습니까? – coolmine

+0

@Oded 간단한 if 문에 의한 'OverflowException'의 막대한 비용이 들지 않으면 이것이 가능해야한다고 생각합니다. – SeToY

답변

0

오류 처리는 (대부분) 메서드 외부에서 수행되어야합니다. 지금은 예외를 숨기고 잘못된 결과를 반환합니다 (오류가 발생하면 0이 반환됩니다). 메서드 호출자는 결과가 맞는지 또는 OverflowException으로 인한 것인지 알 수 없습니다.

나는 그런 방법 다시 것 :

public static decimal GetPercentValue(decimal? percentage, decimal baseValue) 
{ 
    if (percentage == null) 
     return 0; 

    return baseValue*(percentage.Value/100); 
} 

을 그리고 선택적으로 사용자가 실제 메서드를 호출하기 전에 매개 변수를 확인하기 위해 호출 할 수있는 검증 방법을 추가 .. 유효성 검사 오류는 UI에 표시 할 수있다 :

public static string ValidatePercentValue(decimal? percentage, decimal baseValue) 
{ 
    try 
    { 
     GetPercentValue(percentage, baseValue); 
     return null; 
    } 
    catch (Exception ex) 
    { 
     return ex.Message; 
    } 
} 

그 노트 게다가 그 ...

baseValue*(percentage.Value/100) 

... ~보다 낫다 ...

baseValue*percentage.Value/100 

100 % decimal.MaxValue를 계산하십시오. 첫 번째는 작동하고 두 번째 오버플로는 OverflowException을 발생시킵니다.

1

이 질문은 오래된 질문이지만 비슷한 문제가 발생하여 가능한 대체 솔루션을 제공 할 생각입니다. 이 문제는 두 개의 숫자를 계산할 때 MaxValue보다 큰 숫자를 생성 할 때 발생합니다. 이 예외가 발생하고, 일반적인 방법으로 테스트하기 어렵다 :

decimal existingValue = decimal.MaxValue; 
decimal newValue = (decimal)100; 

//doesn't work -- exception thrown here 
if(existingValue + newValue <= decimal.MaxValue) 
{ 

} 

A와이 경우 방정식을 다시 작성하는 것입니다 (try-catch 블록을 사용하지 않고) 나를 위해 작동하는 것 같다 솔루션 빼기 :

if(decimal.MaxValue - existingValue >= newValue) 
{ 
    //DoSomething 
} 

뺄셈 때문에 MaxValue를 초과하지 않습니다. 나는 곱셈/나눗셈 예제를 시도하지 않았지만, 그것도 효과가있을 것이라고 추측하고 있습니다.

관련 문제