Deux cas courants à considérer:
Arithmétique entière
Évidemment, si vous utilisez une arithmétique entière (qui tronque), vous obtiendrez un résultat différent. Voici un petit exemple en C #:
public static void TestIntegerArithmetic()
{
int newValue = 101;
int oldValue = 10;
int SOME_CONSTANT = 10;
if(newValue / oldValue > SOME_CONSTANT)
{
Console.WriteLine("First comparison says it's bigger.");
}
else
{
Console.WriteLine("First comparison says it's not bigger.");
}
if(newValue > oldValue * SOME_CONSTANT)
{
Console.WriteLine("Second comparison says it's bigger.");
}
else
{
Console.WriteLine("Second comparison says it's not bigger.");
}
}
Sortie:
First comparison says it's not bigger.
Second comparison says it's bigger.
Arithmétique en virgule flottante
Outre le fait que la division peut produire un résultat différent lorsqu'elle se divise par zéro (elle génère une exception, contrairement à la multiplication), elle peut également entraîner des erreurs d'arrondi légèrement différentes et un résultat différent. Exemple simple en C #:
public static void TestFloatingPoint()
{
double newValue = 1;
double oldValue = 3;
double SOME_CONSTANT = 0.33333333333333335;
if(newValue / oldValue >= SOME_CONSTANT)
{
Console.WriteLine("First comparison says it's bigger.");
}
else
{
Console.WriteLine("First comparison says it's not bigger.");
}
if(newValue >= oldValue * SOME_CONSTANT)
{
Console.WriteLine("Second comparison says it's bigger.");
}
else
{
Console.WriteLine("Second comparison says it's not bigger.");
}
}
Sortie:
First comparison says it's not bigger.
Second comparison says it's bigger.
Au cas où vous ne me croyez pas, voici un violon que vous pouvez exécuter et voir par vous-même.
D'autres langues peuvent être différentes. Gardez toutefois à l'esprit que C #, comme de nombreux langages, implémente une bibliothèque à virgule flottante au standard IEEE (IEEE 754) . Vous devriez donc obtenir les mêmes résultats dans d'autres temps d'exécution normalisés.
Conclusion
Si vous travaillez en greenfield , vous allez probablement bien.
Si vous travaillez sur du code hérité et que l'application est une application financière ou une autre application sensible qui effectue des calculs et est tenue de fournir des résultats cohérents, faites très attention lorsque vous modifiez des opérations. Si vous devez le faire, assurez-vous de disposer de tests unitaires capables de détecter d'éventuels changements subtils dans l'arithmétique.
Si vous ne faites que compter les éléments dans un tableau ou d’autres fonctions de calcul générales, tout ira bien. Je ne suis pas sûr que la méthode de multiplication rend votre code plus clair, cependant.
Si vous implémentez un algorithme dans une spécification, je ne changerais rien du tout, pas uniquement à cause du problème d'erreurs d'arrondi, mais pour que les développeurs puissent revoir le code et faire correspondre chaque expression à la spécification pour s'assurer qu'il n'y a pas d'implémentation. défauts.
oldValue >= 0
?