分母の一部がゼロになることもある除算を含む式があります。ただし、そのような場合は、例外をスローするのではなく、その除算を1にする必要があります。これを行うための簡単な方法はありますか、それとも、この望ましい効果を得るために、ifステートメントを実行して式への入力を変更する必要がありますか?
8 に答える
ここで動機を問う必要がありますが、必要に応じて機能を作成してください。
double SafeDiv(double num, double denom) {
if(denom == 0) {
return 1;
}
return num/denom;
}
除算する関数を書くことができます。拡張機能のサンプルアイデアは次のとおりです。
public static float DivideBy(this float toBeDivided, float divideBy){
try
{
return toBeDivided / divideBy;
}
catch(DivideByZeroException)
{
return 1.0;
}
}
組み込み型の除算演算子を再定義することはできないため、関数に除算のバージョンを実装する必要があります。
このようなもの?
public T divide<T>(T dividend, T divisor) {
return ((divisor == 0) ? (1) : (dividend / divisor));
}
多分...
public T divide<T>(T dividend, T divisor) {
try {
return dividend / divisor;
}
catch (DivideByZeroException) {
return 1;
}
}
個人的には、除数が0になる場合があることを知っている場合、その場合は「例外的」とは見なさないため、最初のアプローチを使用します(非常に便利な場合は、手動でインライン化することもできます)。
そうは言っても、私はChris Marasti-Georgが書いたことに同意し、これを行う動機に疑問を投げかけます。
いいえ。あなたの質問を理解した場合は、除算操作の動作を変更して、スローではなく1を返すようにします。それをする方法はありません。
ゼロに等しくない場合は、最初に分母を確認して操作を実行します
public double ReturnValueFunction(int denominator, int numerator)
{
try
{
if(denominator!=0)
{
return numerator/ denominator;
/* or your code */
}
else
{
/*your code*/
return someDecimalnumber;
}
}
catch(Exception ex)
{
}
}
除数または除数のいずれかがdoubleで、除数が0(または0.0)の場合、結果は正または負の無限大になります。スローせずに後続のすべての操作を通過し、代わりに、他のオペランドに応じて±InfinityまたはNaNを返します。後で、最終的な値が何か意味があるかどうかを確認できます。
何らかの理由でゼロ除算時に1を返す必要がある場合は、いくつかのオプションがあります。
- カスタムジェネリック関数
- オーバーロードされた演算子を使用したカスタムタイプ
- 除算の前に除数が0であるかどうかを確認します
私の知る限り、これは通常行われることではないので、なぜそうするのかを考え直すかもしれません。
多分あなたはこれを試すことができます
double res = a / (b == 0 ? a : b);