El valor 22.8 no se puede representar exactamente en el punto flotante binario. Lo que está viendo es una representación basada en el formato de visualización. Los diferentes métodos de visualización pueden usar diferentes formatos de visualización. Mostrar diferentes números de dígitos y el redondeo significa que tanto 22.8 como 22.7999999 son correctos para el número de dígitos que se muestran después del redondeo. Tenga en cuenta que se mostró el 22.7999999 y no el 22.8000000 porque el siguiente dígito fue 2, por lo que el valor mostrado se redondeó.
Esto depende de la base, es decir, las cosas que pueden ser exactos en un número Base puede no ser exacto en una base de números diferente. En este caso, 22.8 en la base de número decimal no puede ser exacta en la base de números binarios.
Esta es la razón por la que existe NSDecimal y la razón por la que el punto flotante no se usa para los valores monetarios.
Esto es algo equivalente a mostrar el valor de PI en Base Decimal, el número de dígitos es infinito, por lo que para cada pantalla alguien decidió cuántos dígitos mostrar. Curiosamente, PI se puede representar exactamente (pero útilmente) en la base de números PI. :-)
En el caso de float
y double
Hay un número finito de dígitos que se pueden representar.