Due casi comuni da considerare:
Aritmetico intero
Ovviamente se usi 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.");
}
}
Output:
First comparison says it's not bigger.
Second comparison says it's bigger.
Aritmetica in virgola mobile
A parte il fatto che la divisione può produrre un risultato diverso quando divide per zero (genera un errore, mentre la moltiplicazione non lo fa), 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.");
}
}
Output:
First comparison says it's not bigger.
Second comparison says it's bigger.
Nel caso in cui non mi credi, qui c'è un Fiddle che puoi eseguire e vedere tu stesso.
Altre lingue potrebbero essere diverse; tenere presente, tuttavia, che C #, come molte altre lingue, implementa una libreria IEEE standard (IEEE 754) a virgola mobile, quindi dovresti ottenere gli stessi risultati in altri tempi di esecuzione standardizzati.
Conclusione
Se lavori campo verde , probabilmente stai bene.
Se si sta lavorando su un codice legacy e l'applicazione è un'applicazione finanziaria o di altro tipo sensibile che esegue operazioni aritmetiche ed è richiesta per fornire risultati coerenti, sii molto prudente quando cambi le operazioni. Se devi, assicurati di avere dei test unitari in grado di rilevare eventuali cambiamenti nell'aritmetica.
Se stai semplicemente facendo cose come contare gli elementi in una matrice o altre funzioni computazionali generali, probabilmente starai bene. Non sono sicuro che il metodo di moltiplicazione renda più chiaro il tuo codice.
Se stai implementando un algoritmo per 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 ogni espressione alle specifiche per assicurarti che non ci sono difetti di implementazione.