Dos casos comunes a considerar:
Aritmética de enteros
Obviamente, si está utilizando aritmética de enteros (que se trunca) obtendrá un resultado diferente. Aquí hay un pequeño ejemplo 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.");
}
}
Salida:
First comparison says it's not bigger.
Second comparison says it's bigger.
Aritmética de punto flotante
Además del hecho de que la división puede producir un resultado diferente cuando se divide por cero (genera una excepción, mientras que la multiplicación no), también puede generar errores de redondeo ligeramente diferentes y un resultado diferente. Ejemplo 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.");
}
}
Salida:
First comparison says it's not bigger.
Second comparison says it's bigger.
En caso de que no me creas, aquí hay un Fiddle que puedes ejecutar y ver por ti mismo.
Otros idiomas pueden ser diferentes; Sin embargo, tenga en cuenta que C #, como muchos lenguajes, implementa una biblioteca de punto flotante estándar IEEE (IEEE 754) , por lo que debería obtener los mismos resultados en otros tiempos de ejecución estandarizados.
Conclusión
Si está trabajando en zonas verdes , probablemente esté bien.
Si está trabajando en código heredado, y la aplicación es una aplicación financiera u otra aplicación sensible que realiza operaciones aritméticas y debe proporcionar resultados consistentes, tenga mucho cuidado al cambiar las operaciones. Si es necesario, asegúrese de tener pruebas unitarias que detecten cualquier cambio sutil en la aritmética.
Si solo está haciendo cosas como contar elementos en una matriz u otras funciones computacionales generales, probablemente estará bien. Sin embargo, no estoy seguro de que el método de multiplicación aclare su código.
Si está implementando un algoritmo para una especificación, no cambiaría nada en absoluto, no solo por el problema de los errores de redondeo, sino para que los desarrolladores puedan revisar el código y asignar cada expresión a la especificación para garantizar que no haya implementación defectos
oldValue >= 0
?