Spesso ho bisogno di eseguire il floor o il ceil a CGFloat
su un int
, per il calcolo di un indice di array.Come poggiare o gettare in sicurezza un CGFloat su int?
Il problema che vedo in modo permanente con floorf(theCGFloat)
o ceilf(theCGFloat)
è che ci possono essere problemi con imprecisioni in virgola mobile.
Quindi, se il mio CGFloat
è 2.0f
ma internamente è rappresentato come 1.999999999999f
o qualcosa del genere. Faccio floorf
e ottengo 1.0f
, che è di nuovo un float. Eppure devo lanciare questa bestia su int che potrebbe introdurre un altro problema.
C'è una buona pratica come pavimento o ceil un float
a un int
tale che una cosa del genere non sarebbe mai 2.0
accidentalmente pavimentata a 1
e qualcosa come 2.0
sarebbe mai accidentalmente ceiled a 2
?
Questa domanda non si può rispondere in modo corretto fino a quando le specifiche sono forniti che descrive l'errore nel valore di ingresso e quali sono le conseguenze di valori che sono troppo ritorno alto o troppo basso. Ci sono dei compromessi tra la restituzione di un valore troppo alto perché il precedente errore di arrotondamento ha reso il valore troppo alto e restituendo un valore troppo basso perché il valore è stato regolato artificialmente per compensare l'errore precedente e viceversa. Senza spiegazione del contesto, non esiste un'unica risposta corretta. –