La valeur 22.8 ne peut pas être représentée exactement au point flottant binaire. Ce que vous voyez, c'est une représentation basée sur le format d'affichage. Différentes méthodes d'affichage peuvent utiliser différents formats d'affichage. L'affichage de différents chiffres et l'arrondi signifie que les 22,8 et 22.7999999 sont corrects pour le nombre de chiffres affichés après l'arrondi. Notez que 22.7999999 a été affiché et non 22.8000000 car le chiffre suivant était 2, donc la valeur affichée a été arrondie.
Ceci dépend de la base, c'est-à-dire des choses qui peuvent être exactes dans une base de nombres peuvent ne pas être exactes dans une base numérique différente. Dans ce cas, 22.8 dans la base de numéros décimaux ne peut pas être exact dans la base du nombre binaire.
C'est la raison pour laquelle nsdecimal existe et la raison pour laquelle le point flottant n'est pas utilisé pour les valeurs monétaires.
Ceci est quelque peu équivalent à l'affichage de la valeur de Pi en décimal de base, le nombre de chiffres est infini, donc pour chaque affichage quelqu'un a décidé du nombre de chiffres à montrer. Fait intéressant, PI peut être représenté exactement (mais utilement) dans la base du nombre PI. :-)
Dans le cas de float
et double
Il y a un nombre fini de chiffres qui peuvent être représentés.