Un simple '==' entre doubles te traiciona. En la vida real, esas diferencias minúsculas pueden romper validaciones y decisiones de negocio.
En mi día a día me enfrento a cálculos que deben cuadrar con límites tolerables: distancias, tolerancias de sensores, resultados numéricos de física. Si comparo con ==, me encuentro con falsos negativos o positivos por diferencias que ni se ven en la UI. Para ordenar números, comparar a mano con a - b también puede fallar por overflow o NaN. Por eso conviene separar dos ideas: igualdad con tolerancia y ordenación estable.
La idea clave es simple: usa una tolerancia al comparar, y usa métodos de la clase Math para el orden. Para igualdad, calcula la diferencia y ajústala con una escala razonable; para ordenar, evita restas y usa Double.compare. Así reduces sorpresas en producción y haces que tu lógica sea determinista incluso con operaciones de precisión limitada.
Ejemplo práctico (una utilidad mínima):
public class MathUtils {
public static boolean nearlyEqual(double a, double b, double eps) {
double diff = Math.abs(a - b);
if (diff <= eps) return true;
double m = Math.max(Math.abs(a), Math.abs(b));
return diff <= m * eps;
}
public static int compare(double a, double b) { return Double.compare(a, b); }
}
Usa la utilidad así: MathUtils.nearlyEqual(a, b, 1e-12). Si necesitas ordenar, usa MathUtils.compare(x, y) en lugar de restar.
Acción para hoy: identifica dos lugares críticos de tu código donde comparas doubles y aplica una comparación tolerante con nearlyEqual, además de reemplazar restas por Double.compare para cualquier ordenación. Si te sirve, empieza con un epsilon relativo de 1e-12 y ajústalo a tus rangos de negocio.
Top comments (0)