Como otros han mencionado, probablemente querrás usar el BigDecimal
clase, si quieres tener una representación exacta de 11.4.
Ahora, una pequeña explicación de por qué sucede esto:
Los tipos float
y double
primitivos en Java son números de coma flotante , donde el número se almacena como una representación binaria de una fracción y un exponente.
Más específicamente, un valor de coma flotante de doble precisión como el double
tipo es un valor de 64 bits, donde:
- 1 bit denota el signo (positivo o negativo).
- 11 bits para el exponente.
- 52 bits para los dígitos significativos (la parte fraccionaria como binario).
Estas partes se combinan para producir una double
representación de un valor.
(Fuente: Wikipedia: Doble precisión )
Para obtener una descripción detallada de cómo se manejan los valores de punto flotante en Java, consulte la Sección 4.2.3: Tipos, formatos y valores de punto flotante de la Especificación del lenguaje Java.
Los byte
, char
, int
, long
tipos son de punto fijo números, que son representions exactas de números. A diferencia de los números de punto fijo, los números de coma flotante algunas veces (es seguro asumir "la mayoría de las veces") no podrán devolver una representación exacta de un número. Esta es la razón por la que terminas 11.399999999999
como resultado de 5.6 + 5.8
.
Cuando requiera un valor exacto, como 1.5 o 150.1005, querrá usar uno de los tipos de punto fijo, que podrá representar el número exactamente.
Como ya se ha mencionado varias veces, Java tiene una BigDecimal
clase que manejará números muy grandes y números muy pequeños.
De la referencia de la API de Java para la BigDecimal
clase:
Inmutables, números decimales con precisión arbitraria. Un BigDecimal consiste en un valor entero sin escala de precisión arbitraria y una escala entera de 32 bits. Si es cero o positivo, la escala es el número de dígitos a la derecha del punto decimal. Si es negativo, el valor sin escala del número se multiplica por diez a la potencia de la negación de la escala. El valor del número representado por BigDecimal es por lo tanto (unscaledValue × 10 ^ -scale).
Ha habido muchas preguntas sobre Stack Overflow relacionadas con la cuestión de los números de coma flotante y su precisión. Aquí hay una lista de preguntas relacionadas que pueden ser de interés:
Si realmente quiere llegar a los detalles esenciales de los números de coma flotante, eche un vistazo a Lo que todo informático debe saber sobre la aritmética de coma flotante .