2011-02-02 18 views
5

Ho un doppio che è un intervallo di tempo in secondi. I valori validi sono 0.0, 0.5, 1.0, 1.5, ecc.Come convertire in modo sicuro questo doppio in un int?

Ora ho bisogno di convertire questo valore in un int. Ma non posso fare questo:

int converted = (int)theDouble; 

Perché ciò che può accadere è che il mio doppio a causa di errori di virgola mobile è ,999,999999 millions piuttosto che 1,000 milioni. Sarebbe solo tagliato la coda, e avremmo finito con 0 invece di 1. Inoltre, quando il mio doppio è 0.9, voglio un int che è 1. Quando è 1.1, voglio che l'int sia 1. Quando è 1,8, voglio che int sia 2.

C'è una funzione round() ma Xcode non mostra una documentazione per questo. L'intestazione dice solo che restituisce un doppio. Quindi non quello di cui ho bisogno.

Qual è il modo più sicuro per ottenere una rappresentazione int stretta di quel doppio? Sebbene sia un doppio, non avrò mai bisogno di una precisione maggiore di 0,5 o di una cifra frammentaria (non sono un genio della matematica e non conosco i termini scientifici esatti).

risposta

2

Come altri hanno suggerito, puoi arrotondare theDouble, ma tieni presente che non devi mai contare su variabili in virgola mobile per una precisione precisa. Invece di cercare di confrontare theDouble con un numero intero per l'uguaglianza, si dovrebbe fare qualcosa di simile:

if (abs(theDouble - theInteger) <= 0.000001) 
    doSomething(); 

Ricordate, theInteger sta per essere gettato in una doppia prima del confronto, quindi potrebbe non essere precisi neanche.

Un'ultima cosa, chiamando:

int converted = (int) round(theDouble) 

è leggermente pericoloso, perché, come hai detto, l'errore in virgola mobile potrebbe portare il valore verso il basso. Se sai che il tuo valore sarà solo 0, 0.5, 1.0, 1.5, ..., perché non fare qualcosa del genere ?:

int converted = (int) (round(theDouble) + 0.1) 
4

fare questo:

int converted = (int)(round(theDouble)); 
5
int converted = (int)round(theDouble); 
2

Usa round in math.h. Restituisce un doppio, ma nel tuo caso puoi lanciarlo su un int. Oppure usa lround (anche in math.h), che prende un double e restituisce un int lungo.

7

Probabilmente stai cercando il lround (doppia funzione). La firma appare così.

lungo raggio (doppio).

Altre opzioni sono

  • long int lrint (doppia)
  • long long int llrint (doppia)
  • long int llround lunga (doppia)
Problemi correlati