54 votes

Diviser par zéro et pas d'erreur?

Juste jeté un simple test, pas pour une raison particulière autre que je voudrais essayer d'avoir des tests pour tous mes méthodes, même si celui-ci est assez simple, ou alors j'ai pensé.

    [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);
    }

Comme vous pouvez le voir dans la méthode d'essai, je SUIS de diviser par zéro. Le problème, c'est qu'elle ne génère pas une erreur. Voir l'erreur d'affichage de la fenêtre ci-dessous.

Error List View from VS2017

Au lieu d'une erreur c'est de donner une valeur de l'infini? Ce qui me manque?J'ai donc googlé et trouvé que les doubles divisé par zéro NE génère PAS une erreur, ils donnent une valeur null ou de l'infini. La question devient alors, comment fait un test pour une Infinité de valeur de retour?

89voto

Dmitry Bychenko Points 17719

Vous n'allez avoir DivideByZeroException que dans le cas de valeurs entières :

 int total = 3;
int numberOf = 0;

var tot = total / numberOf; // DivideByZeroException thrown 
 

Si au moins un argument est une valeur à virgule flottante ( double dans la question), vous aurez le résultat FloatingPointType.PositiveInfinity ( double.PositiveInfinity dans le contexte) et aucune exception.

 double total = 3.0;
int numberOf = 0;

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

7voto

Shankar Points 156

Vous pouvez vérifier comme ci-dessous

 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))
{
    ...
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X