Ciò è dovuto al modo in cui funziona il formato a virgola mobile. A Float
è un numero a virgola mobile a 32 bit, memorizzato nello IEEE 754 format, che è in pratica una notazione scientifica, con alcuni bit allocati al valore e alcuni all'esponente (in base 2), in quanto questo diagramma da single-precision floating-point number Wikipedia article mostra:
Così il numero effettivo è rappresentato come
(sign) * (value) * (2^(exponent))
poiché il numero di bit allocati a memorizzare in realtà un valore intero (24) è inferiore al numero di bit assegnato per questo in un normale intero (tutti 32), al fine di rendere r oom per l'esponente, le cifre meno significative di grandi numeri saranno sacrificate, in cambio della capacità di rappresentare numeri quasi infiniti (un normale Int
può rappresentare solo interi nell'intervallo da -2^31 a 2^31 - 1).
Alcuni test approssimativa indica che ogni intero fino al (2^24) può essere rappresentato esattamente in un galleggiante 32 bit, mentre interi maggiori saranno arrotondati al multiplo più vicino di alcuni potenza di 2.
Si noti che questo non è specifico di Swift. Questo formato in virgola mobile è un formato standard utilizzato in quasi tutti i linguaggi di programmazione. Ecco l'output che ricevo da LLDB con piano C:
Se avete bisogno di una maggiore precisione, utilizzare un Double
. I galleggianti a doppia precisione utilizzano 64 bit di memoria e hanno una precisione maggiore.
sì, è così che funziona il floating point. –
possibile duplicato di [Perdita di precisione - int -> float o double] (http://stackoverflow.com/questions/2781086/loss-of-precision-int-float-or-double) –
@TheParamagneticCroissant Penso che sia non duplicato perché in Swift questi tipi (Float Double Int) sono strutture e questo problema di valori float semplici può essere risolto – kostyl