私は int.MaxValue をペナルティとして使用し、時々ペナルティを一緒に計算しています。機能はありますか、またはそれを行う最も優雅で効率的な機能をどのように作成しますか.
すなわち。
50 + 100 = 150
int.Max + 50 = int.Max + 50 ではなく int.Max
この答え...
int penaltySum(int a, int b)
{
return (int.MaxValue - a < b) ? int.MaxValue : a + b;
}
次のテストに失敗します。
[TestMethod]
public void PenaltySumTest()
{
int x = -200000;
int y = 200000;
int z = 0;
Assert.AreEqual(z, penaltySum(x, y));
}
次のようにペナルティサム()を実装することをお勧めします。
private int penaltySum(int x, int y, int max)
{
long result = (long) x + y;
return result > max ? max : (int) result;
}
最大値を渡していることに注意してください。ただし、必要に応じて int.MaxValue をハードコーディングできます。
または、算術演算のオーバーフロー チェックを強制して、次の手順を実行することもできます。
private int penaltySum(int x, int y, int max)
{
int result = int.MaxValue;
checked
{
try
{
result = x + y;
}
catch
{
// Arithmetic operation resulted in an overflow.
}
}
return result;
}
int penaltySum(int a, int b)
{
return (int.MaxValue - a < b) ? int.MaxValue : a + b;
}
更新:ペナルティがマイナスになる可能性がある場合は、これがより適切です。
int penaltySum(int a, int b)
{
if (a > 0 && b > 0)
{
return (int.MaxValue - a < b) ? int.MaxValue : a + b;
}
if (a < 0 && b < 0)
{
return (int.MinValue - a > b) ? int.MinValue : a + b;
}
return a + b;
}
オーバーフローが多いですか、それともエラー状態ですか? try/catch (オーバーフロー例外) を使用するのはどうですか?