DEV Community

Jordy Rodríguez
Jordy Rodríguez

Posted on

Simplifica comparaciones númericas con la clase Math en Java

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); }
}
Enter fullscreen mode Exit fullscreen mode

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.



📬 Conecta Conmigo

Top comments (0)