O valor 22.8 não pode ser representado exatamente no ponto flutuante binário. O que você está vendo é uma representação com base no formato de exibição. Diferentes métodos de exibição podem usar diferentes formatos de exibição. Exibir um número diferente de dígitos e o arredondamento significa que 22.8 e 22.7999999 estão corretos para o número de dígitos exibidos após o arredondamento. Observe que 22.7999999 foi exibido e não 22.8000000 porque o próximo dígito foi 2, portanto o valor exibido foi arredondado.
Isso depende da base, que são coisas que podem ser exatas em uma base de números podem não ser capaz de ser exata em uma base de números diferente. Nesse caso, 22.8 na base de números decimais não podem ser exatos na base de números binários.
Esta é a razão pela qual existe nsdecimal e a razão pela qual o ponto flutuante não é usado para valores monetários.
Isso é um pouco equivalente a exibir o valor do PI no decimal básico, o número de dígitos é infinito; portanto, para cada exibição alguém decidiu quantos dígitos mostram. Curiosamente, o PI pode ser representado exatamente (mas útil) na base de números PI. :-)
No caso de float
e double
Há um número finito de dígitos que podem ser representados.