En Java existen dos tipos principales para representar números de punto flotante: float (32 bits) y double (64 bits). float es menos preciso y ocupa menos memoria, mientras que double proporciona mayor precisión y es el tipo preferido por defecto para números de punto flotante.
Características importantes:
Ejemplo de comparación con delta:
public class DoubleComparison { public static void main(String[] args) { double a = 0.1 + 0.2; double b = 0.3; double epsilon = 1e-10; if (Math.abs(a - b) < epsilon) { System.out.println("Iguales con tolerancia"); } else { System.out.println("No son iguales"); } } }
Pregunta: ¿Qué imprimirá el siguiente código?
System.out.println(0.1 + 0.2 == 0.3);
Respuesta: Este código imprimirá false, porque el resultado de la suma 0.1 + 0.2 en formato binario IEEE 754 no es exactamente igual a 0.3 debido a las peculiaridades del almacenamiento de fracciones decimales en los tipos float y double.
Historia
En un gran proyecto financiero, se usaban contadores de dinero en tipo double. En la práctica, operaciones pequeñas a menudo conducían a la acumulación de errores de redondeo, lo que resultaba en sumas finales diferentes por unos pocos centavos. El problema fue resuelto cambiando double por BigDecimal.
Historia
En un motor de juego se utilizaba un arreglo float para almacenar las coordenadas de objetos en un mundo con grandes valores. Al moverse a grandes distancias, se comenzó a perder la precisión en la posición de los objetos, lo que llevó a "temblores" de los objetos en la pantalla. Cambiar float por double y centrar las coordenadas ayudaron a resolver el problema.
Historia
En un programa de análisis estadístico, se comparaban valores dobles usando el operador
==y se obtenía un número inesperado de "desaciertos". Después de cambiar a comparación con delta, la lógica del programa funcionó correctamente.