Cheat sheet de punto flotante para Java

Tipos de punto flotante

Java tiene tipos de precisión sencilla y doble del IEEE 754 soportados por palabras clave:

	float f = 0.1f; // punto flotante de 32 bits, nótese el sufijo f
	double d = 0.1d; // punto flotante de 64 bits, sufijo opcional

La palabra clave strictfp en las clases, interfaces y métodos fuerza también a que todos los resultados intermedios de cálculos en punto flotante sean valores IEEE 754, garantizando resultados idénticos en todas las plataformas. Sin esa palabra clave, las implementaciones pueden usar un rango extendido para el exponente, llevando a resultados más precisos y ejecuciones más rápidas en bastantes CPUs.

Tipos decimales

Java tiene un tipo decimal de precisión arbitraria llamado java.math.BigDecimal, que también permite elegir el método de redondeo.

	BigDecimal a = new BigDecimal("0.1");
	BigDecimal b = new BigDecimal("0.2");
	BigDecimal c = a.add(b); // Devuelve un BigDecimal que representa exactamente 0.3

Cómo redondear

Para obtener una cadena:

	String.format("%.2f", 1.2399) // Devuelve "1.24"
	String.format("%.3f", 1.2399) // Devuelve "1.240"
	String.format("%.2f", 1.2) // Devuelve "1.20"

Para imprimir por la salida estándar (o cualquier PrintStream):

	System.out.printf("%.2f", 1.2399) // Misma sintaxis que String.format()

Si no quieres ceros a la derecha:

	new DecimalFormat("0.00").format(1.2)// Devuelve "1.20"
	new DecimalFormat("0.##").format(1.2)// Devuelve "1.2"

Si necesitas un método de redondeo específico:

	new BigDecimal("1.25").setScale(1, RoundingMode.HALF_EVEN); // Devuelve 1.2

Recursos

© Publicado en http://puntoflotante.org/ bajo una licencia Creative Commons Atribución Unported (BY). Original en inglés por Michael Borgwardt en http://floating-point-gui.de/.

Fork me on GitHub