2016-11-04 11 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; 
    } 
} 

問題があり、このオーバーフローは「例外は例外的であるべき」ガイドラインを壊し、私のユースケースにはかなり頻繁に起こります。これはアプリケーションを遅くします、はい、それはそれほど重要ではありません。実際の問題は、デバッグ中に最初のチャンスの例外が多く発生することです。これは面倒です。ここでは2番めの試行がうまくいきます:

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それは高精度なものでも何もありません。倍精度を扱うハードウェアと、ユーザーが指定した10進数の設定とのやりとりを行うためのものです。ハードウェアには限界がありますが、ユーザーが気にかけない範囲が非常に広いことがよくあります。 –

+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

私はこれらの属性について、感謝していませんでした。非常に便利。ところで、私は実際に自分でこれを理解しようと数分を費やしましたが、(double)decimal.MinValueまたは(double)decimal.MaxValueを入力すると例外が発生するようです。比較を含めて(<= and > =)問題を解決していますが、境界内にある値を見つけてクラッシュするかどうか調べる必要があります。 –

関連する問題