Dois casos comuns a serem considerados:
Aritmética de número inteiro
Obviamente, se você estiver usando aritmética inteira (que trunca), obterá um resultado diferente. Aqui está um pequeno exemplo em 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.");
}
}
Resultado:
First comparison says it's not bigger.
Second comparison says it's bigger.
Aritmética de ponto flutuante
Além do fato de que a divisão pode gerar um resultado diferente quando divide por zero (gera uma exceção, enquanto a multiplicação não), também pode resultar em erros de arredondamento ligeiramente diferentes e em um resultado diferente. Exemplo simples em 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.");
}
}
Resultado:
First comparison says it's not bigger.
Second comparison says it's bigger.
Caso você não acredite em mim, aqui está um violino que você pode executar e ver por si mesmo.
Outros idiomas podem ser diferentes; lembre-se, no entanto, que o C #, como muitas linguagens, implementa uma biblioteca de ponto flutuante padrão IEEE (IEEE 754) , portanto, você deve obter os mesmos resultados em outros tempos de execução padronizados.
Conclusão
Se você está trabalhando no greenfield , provavelmente está bem.
Se você estiver trabalhando no código legado, e o aplicativo for um aplicativo financeiro ou outro sensível que executa aritmética e é necessário para fornecer resultados consistentes, tenha muito cuidado ao mudar as operações. Se necessário, verifique se você possui testes de unidade que detectam alterações sutis na aritmética.
Se você está apenas fazendo coisas como contar elementos em uma matriz ou outras funções computacionais gerais, provavelmente estará bem. Não tenho certeza se o método de multiplicação deixa seu código mais claro.
Se você estiver implementando um algoritmo em uma especificação, eu não mudaria nada, não apenas por causa do problema de erros de arredondamento, mas para que os desenvolvedores possam revisar o código e mapear cada expressão de volta à especificação para garantir que não haja implementação falhas.
oldValue >= 0
?