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
일 수 있으며 변환시에도 여전히 오버플로가 발생합니까?
처음에는 'double'대신 'decimal'을 사용하는 이유는 무엇입니까? 당신이 옳은 일이 아닌 재정적 인 것보다는 엔지니어링이나 과학적인 계산에'십진법 '을 사용하는 것처럼 들립니다. –
@MatthewWatson 그것은 고정밀도가 아닙니다. double 형을 다루는 하드웨어와 사용자가 제공하고 십진수를 사용하는 설정 사이에서 상호 작용하는 것입니다. 하드웨어는 한계를 제공하는데, 사용자가 어쨌든 신경 쓰지 않는 범위가 종종 있습니다. –
@MatthewWatson "상당히 자주"는 초당 1000 회를 의미하지는 않습니다. 설정 한계를 잡으면 총 100 회를 의미합니다. –