web-dev-qa-db-ja.com

ゼロで除算してエラーなし?

単純なテストをまとめただけで、特定の理由ではなく、すべてのメソッドのテストを行うのが好きです。

    [TestMethod]
    public void Test_GetToolRating()
    {
        var rating = GetToolRating(45.5, 0);
        Assert.IsNotNull(rating);
    }


    private static ToolRating GetToolRating(double total, int numberOf)
    {
        var ratingNumber = 0.0;

        try
        {
            var tot = total / numberOf;
            ratingNumber = Math.Round(tot, 2);
        }
        catch (Exception ex)
        {
            var errorMessage = ex.Message;
            //log error here
            //var logger = new Logger();
            //logger.Log(errorMessage);
        }


        return GetToolRatingLevel(ratingNumber);
    }

テスト方法でわかるように、私はゼロで除算しています。問題は、エラーを生成しないことです。以下のエラーウィンドウの表示を参照してください。

Error List View from VS2017

エラーの代わりに、無限の値を与えていますか?何が欠けているのでしょうか?グーグルで調べたところ、ダブルをゼロで除算すると、nullまたは無限大を与えるエラーが生成されませんでした。問題は、Infinityの戻り値をどのようにテストするかです。

48
dinotom

整数値の場合にのみDivideByZeroExceptionを使用します。

int total = 3;
int numberOf = 0;

var tot = total / numberOf; // DivideByZeroException thrown 

少なくとも1つの引数が浮動小数点値(問題のdouble)の場合、結果としてFloatingPointType.PositiveInfinityになります(double.PositiveInfinityコンテキスト内)および例外なし

double total = 3.0;
int numberOf = 0;

var tot = total / numberOf; // tot is double, tot == double.PositiveInfinity
79
Dmitry Bychenko

以下のように確認できます

double total = 10.0;
double numberOf = 0.0;
var tot = total / numberOf;

// check for IsInfinity, IsPositiveInfinity,
// IsNegativeInfinity separately and take action appropriately if need be
if (double.IsInfinity(tot) || 
    double.IsPositiveInfinity(tot) || 
    double.IsNegativeInfinity(tot))
{
    ...
}
6
Shankar