0

私は現在、パーセント値を返す次のメソッドを取得しています。たとえば、商品価格が $350,000 でパーセンテージが 7% の場合、24,500 が返されます。

    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ユーザーが非常識な数値を入力して計算すると、OverflowException がスローされ9999999999%ます。このように、そうではないという理由だけで、percentageまたはチェックすることはできません... 計算結果自体が10進数の範囲を超えています。baseValue<= decimal.MaxValue

4

2 に答える 2

1

これは古い質問ですが、同様の問題に遭遇し、可能な代替ソリューションを提供することを考えました. この問題は、2 つの数値の計算で MaxValue より大きい数値が生成される場合に発生します。これにより例外が発生し、通常の方法でテストするのは困難です。

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

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

}

(Try-Catch ブロックを使用せずに) 私にとってうまくいくと思われる解決策は、この場合は減算として方程式を書き直すことです。

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

減算のため、MaxValue を超えていません。乗算/除算の例は試していませんが、うまくいくと思います。

于 2014-01-31T16:28:34.130 に答える
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

decimal.MaxValue の 100% を計算してみてください。最初のものは機能しますが、2 つ目は OverflowException をスローします。

于 2012-09-01T19:45:38.920 に答える