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
となりますが、変換時にはまだオーバーフローが発生しますか?
これはかなり頻繁に起こっている場合、最初は「double」ではなく「decimal」を使用しています。財務的なものではなく、工学的または科学的な計算に '十進数 'を使用しているように思えます。これは正しいことではありません。 –
@MatthewWatsonそれは高精度なものでも何もありません。倍精度を扱うハードウェアと、ユーザーが指定した10進数の設定とのやりとりを行うためのものです。ハードウェアには限界がありますが、ユーザーが気にかけない範囲が非常に広いことがよくあります。 –
@MatthewWatson「かなり頻繁に」というのは、毎秒1000回という意味ではなく、設定限界をとると合計100回という意味です。 –