Como outros já mencionaram, você provavelmente desejará usar a BigDecimal
classe, se quiser ter uma representação exata de 11.4.
Agora, uma pequena explicação sobre por que isso está acontecendo:
Os tipos float
e double
primitivo em Java são números de ponto flutuante , onde o número é armazenado como uma representação binária de uma fração e um expoente.
Mais especificamente, um valor de ponto flutuante de precisão dupla, como o double
tipo, é um valor de 64 bits, em que:
- 1 bit indica o sinal (positivo ou negativo).
- 11 bits para o expoente.
- 52 bits para os dígitos significativos (a parte fracionária como um binário).
Essas partes são combinadas para produzir uma double
representação de um valor.
(Fonte: Wikipedia: precisão dupla )
Para obter uma descrição detalhada de como os valores de ponto flutuante são manipulados em Java, consulte a Seção 4.2.3: Tipos, formatos e valores de ponto flutuante da especificação da linguagem Java.
Os byte
, char
, int
, long
tipos são ponto fixo de números, que são representions exactas de números. Diferentemente dos números de ponto fixo, os números de ponto flutuante algumas vezes (é seguro assumir "na maioria das vezes") não poderão retornar uma representação exata de um número. Esta é a razão pela qual você acaba 11.399999999999
como resultado de 5.6 + 5.8
.
Ao exigir um valor exato, como 1,5 ou 150.1005, você desejará usar um dos tipos de ponto fixo, que será capaz de representar o número exatamente.
Como já foi mencionado várias vezes, Java possui uma BigDecimal
classe que manipulará números muito grandes e números muito pequenos.
Na Referência da API Java da BigDecimal
classe:
Números decimais assinados com precisão arbitrária e imutável. Um BigDecimal consiste em um valor inteiro não escalonado de precisão arbitrária e uma escala inteira de 32 bits. Se zero ou positivo, a escala é o número de dígitos à direita do ponto decimal. Se negativo, o valor não escalado do número é multiplicado por dez à potência da negação da escala. O valor do número representado pelo BigDecimal é, portanto, (unscaledValue × 10 ^ -scale).
Existem muitas perguntas sobre o Stack Overflow relacionadas à questão dos números de ponto flutuante e sua precisão. Aqui está uma lista de perguntas relacionadas que podem ser interessantes:
Se você realmente quer se aprofundar nos mínimos detalhes dos números de ponto flutuante, dê uma olhada no que todo cientista da computação deve saber sobre aritmética de ponto flutuante .