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并计算9999999999%它时,会引发 OverflowException。这样我就无法检查percentage或仅仅baseValue因为<= decimal.MaxValue它们不是……计算结果本身就超出了小数范围。

4

2 回答 2

1

这是一个老问题,但我遇到了类似的问题,并想提供一个可能的替代解决方案。当两个数字的某些计算产生一个大于 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

尝试计算 100% 的 decimal.MaxValue。第一个有效,而第二个则引发 OverflowException。

于 2012-09-01T19:45:38.920 回答