Il valore 22.8 non può essere rappresentato esattamente nel punto mobile binario. Quello che stai vedendo è una rappresentazione basata sul formato di visualizzazione. Diversi metodi di visualizzazione possono utilizzare diversi formati di visualizzazione. La visualizzazione di un numero diverso di cifre e l'arrotondamento significa che sia 22,8 che 22.7999999 sono corretti per il numero di cifre visualizzate dopo l'arrotondamento. Si noti che è stato visualizzato 22.7999999 e non 22.8000000 perché la cifra successiva era 2, quindi il valore visualizzato è stato arrotondato.
Questo dipende dalla base, che sono cose che possono essere esatte in una base numerica potrebbe non essere in grado di essere esatti in una base numerica diversa. In questo caso 22,8 nella base del numero decimale non può essere esatto nella base di numeri binari.
Questo è il motivo per cui esiste NSDecimal e il motivo per cui il punto galleggiante non viene utilizzato per i valori monetari.
Ciò è in qualche modo equivalente alla visualizzazione del valore di PI in Base Decimal, il numero di cifre è infinito, quindi per ogni display qualcuno ha deciso quante cifre da mostrare. È interessante notare che PI può essere rappresentato esattamente (ma utilmente) nella base numerica PI. :-)
In caso di float
e double
C'è un numero finito di cifre che possono essere rappresentate.