Due casi comuni da considerare:
Aritmetica intera
Ovviamente se stai usando l'aritmetica dei numeri interi (che tronca) otterrai un risultato diverso. Ecco un piccolo esempio in 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.");
}
}
Produzione:
First comparison says it's not bigger.
Second comparison says it's bigger.
Aritmetica a virgola mobile
A parte il fatto che la divisione può produrre un risultato diverso quando si divide per zero (genera un'eccezione, mentre la moltiplicazione no), può anche causare errori di arrotondamento leggermente diversi e un risultato diverso. Semplice esempio in 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.");
}
}
Produzione:
First comparison says it's not bigger.
Second comparison says it's bigger.
Nel caso in cui non mi credi, ecco un violino che puoi eseguire e vedere di persona.
Altre lingue possono essere diverse; tenere presente, tuttavia, che C #, come molti linguaggi, implementa una libreria a virgola mobile standard IEEE (IEEE 754) , quindi si dovrebbero ottenere gli stessi risultati in altri tempi di esecuzione standardizzati.
Conclusione
Se stai lavorando in campo verde , probabilmente stai bene.
Se stai lavorando su un codice legacy e l'applicazione è un'applicazione finanziaria o di altro tipo che esegue operazioni aritmetiche ed è necessaria per fornire risultati coerenti, fai molta attenzione quando cambi le operazioni. Se è necessario, assicurarsi di disporre di unit test che rileveranno eventuali lievi modifiche nell'aritmetica.
Se stai semplicemente facendo cose come contare gli elementi in un array o altre funzioni di calcolo generali, probabilmente starai bene. Tuttavia, non sono sicuro che il metodo di moltiplicazione renda il tuo codice più chiaro.
Se stai implementando un algoritmo su una specifica, non cambierei nulla, non solo a causa del problema degli errori di arrotondamento, ma in modo che gli sviluppatori possano rivedere il codice e mappare ciascuna espressione sulla specifica per garantire che non ci siano implementazioni difetti.
oldValue >= 0
?