Dwa typowe przypadki do rozważenia:
Arytmetyka liczb całkowitych
Oczywiście, jeśli używasz arytmetyki liczb całkowitych (która obcina), otrzymasz inny wynik. Oto mały przykład w języku 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.");
}
}
Wynik:
First comparison says it's not bigger.
Second comparison says it's bigger.
Arytmetyka zmiennoprzecinkowa
Oprócz faktu, że dzielenie może dawać inny wynik, gdy dzieli się przez zero (generuje wyjątek, podczas gdy mnożenie nie), może również powodować nieco inne błędy zaokrąglania i inny wynik. Prosty przykład w języku 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.");
}
}
Wynik:
First comparison says it's not bigger.
Second comparison says it's bigger.
Jeśli mi nie wierzysz, oto skrzypce, które możesz wykonać i przekonać się sam.
Inne języki mogą być inne; pamiętaj jednak, że C #, podobnie jak wiele języków, implementuje bibliotekę zmiennoprzecinkową standardu IEEE (IEEE 754) , więc powinieneś uzyskać te same wyniki w innych znormalizowanych czasach wykonywania.
Wniosek
Jeśli pracujesz na zielonym polu , prawdopodobnie nic ci nie jest.
Jeśli pracujesz nad starszym kodem, a aplikacja jest aplikacją finansową lub inną wrażliwą, która wykonuje arytmetykę i jest wymagana do zapewnienia spójnych wyników, zachowaj ostrożność podczas zmiany operacji. Jeśli musisz, upewnij się, że masz testy jednostkowe, które wykryją wszelkie subtelne zmiany arytmetyki.
Jeśli po prostu robisz takie rzeczy, jak zliczanie elementów w tablicy lub inne ogólne funkcje obliczeniowe, prawdopodobnie będziesz w porządku. Nie jestem jednak pewien, czy metoda mnożenia sprawia, że kod jest bardziej przejrzysty.
Jeśli implementujesz algorytm do specyfikacji, nie zmieniłbym niczego, nie tylko z powodu problemu z zaokrąglaniem błędów, ale także, aby programiści mogli przejrzeć kod i odwzorować każde wyrażenie z powrotem do specyfikacji, aby upewnić się, że nie ma implementacji wady.
oldValue >= 0
?