2010-02-05 15 views
15

Mi sento davvero stupido a chiedere questo perché so come farlo 101 modi, ma non il modo in cui è definito nel libro. (nota, conosco il C++)Arrotondamento con static_cast <int>?

Finora abbiamo esaminato solo le basi del C++. Quindi, in pratica, conosciamo variabili, assegnazioni e casting di base.

Nel libro che sto avendo problemi con questa parte del problema:

  • chiedere all'utente di inserire un numero
  • decimale Convertire quel numero al più vicino intero e stamparlo sullo schermo

così ho il codice banale:

double n; 
cout<<"Number: "; 
cin >> n; 
cout <<endl<<static_cast<int>(n)<<endl; 

Ma ho capito che questo non funziona per me. Tronterà sempre il decimale in modo che 1.9 -> 1 invece del previsto 1.9 -> 2

Come posso risolvere ciò usando solo ciò che "conosco"? (come in, senza round() o se dichiarazioni e simili)

Si tratta di un problema di conformità agli standard? A scuola I ho pensato a Ho avuto qualcosa di simile a lavorare con Visual C++ 2005 su Windows XP a 32 bit, ma ora sono a casa mia a cercare di fare la stessa cosa e non funziona. Il mio compilatore di casa è gcc 3.3.5 su OpenBSD a 64 bit. O potrebbe essere un errore di battitura nel libro?

+0

Questa funzione sarà utile. La caratteristica di non arrotondare. –

risposta

25

static_cast<int>(n+0.5)

O static_cast<int>(n >= 0 ? n + 0.5 : n - 0.5) per più corretto comportamento in negativo n.

+0

ah penzoloni .. Noooow ricordo la mia insegnante che diceva che ... wow mi sento stupido. – Earlz

+4

Ricorda solo che è un comportamento non definito eseguire un tipo floating su un tipo integrale se il valore dell'origine non si adatta alla destinazione. Quindi se l'utente immette "1.0e10", può succedere di tutto. Se sei fortunato, il tuo manuale del compilatore ti dice cosa. Le funzioni 'ceil' e' floor' esistono per una ragione ;-) –

+0

Una volta ho potuto mostrarlo a un programmatore addestrato ad Harvard. –

2

Solo per quello che sai, questo non è un problema con il tuo compilatore. In C++, quando converti un float in un tipo integrale, il valore viene sempre troncato.