Comme d'autres l'ont mentionné, vous voudrez probablement utiliser la BigDecimal
classe, si vous voulez avoir une représentation exacte de 11.4.
Maintenant, une petite explication sur pourquoi cela se produit:
Les types primitifs float
et double
en Java sont des nombres à virgule flottante , où le nombre est stocké sous forme de représentation binaire d'une fraction et d'un exposant.
Plus spécifiquement, une valeur à virgule flottante double précision telle que le double
type est une valeur 64 bits, où:
- 1 bit indique le signe (positif ou négatif).
- 11 bits pour l'exposant.
- 52 bits pour les chiffres significatifs (la partie fractionnaire sous forme de binaire).
Ces parties sont combinées pour produire une double
représentation d'une valeur.
(Source: Wikipedia: Double précision )
Pour une description détaillée de la façon dont les valeurs à virgule flottante sont gérées en Java, reportez-vous à la Section 4.2.3: Types, formats et valeurs à virgule flottante de la spécification du langage Java.
Les byte
, char
, int
, long
types sont fichées numéros, qui sont representions exactes des nombres. Contrairement aux nombres à virgule fixe, les nombres à virgule flottante ne pourront parfois (supposer que "la plupart du temps") ne pourront pas renvoyer une représentation exacte d'un nombre. C'est la raison pour laquelle vous vous retrouvez à 11.399999999999
la suite de 5.6 + 5.8
.
Lorsque vous avez besoin d'une valeur exacte, telle que 1.5 ou 150.1005, vous voudrez utiliser l'un des types à virgule fixe, qui sera en mesure de représenter le nombre exactement.
Comme cela a déjà été mentionné à plusieurs reprises, Java a une BigDecimal
classe qui gère de très grands nombres et de très petits nombres.
À partir de la référence API Java pour la BigDecimal
classe:
Nombres décimaux signés immuables et de précision arbitraire. Un BigDecimal se compose d'une valeur entière non mise à l'échelle de précision arbitraire et d'une échelle d'entiers de 32 bits. S'il est nul ou positif, l'échelle correspond au nombre de chiffres à droite de la virgule décimale. S'il est négatif, la valeur non mise à l'échelle du nombre est multipliée par dix à la puissance de la négation de l'échelle. La valeur du nombre représenté par le BigDecimal est donc (unscaledValue × 10 ^ -scale).
Il y a eu de nombreuses questions sur Stack Overflow concernant la question des nombres à virgule flottante et sa précision. Voici une liste de questions connexes susceptibles de vous intéresser:
Si vous voulez vraiment entrer dans les moindres détails des nombres à virgule flottante, jetez un coup d'œil à ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante .