Salve a tutti
Il mio bizzarro problema è questo:
Sto provando per esercizio a scrivere un programma che, fornito un qualsiasi numero reale, restituisca in due output diversi la parte intera, e le prime tre cifre della parte decimale (vista come intero)
Ad esempio
input k=12.2398
output C=12
output M=239
Questo è il codice che avrei pensato:
#include<iostream>
using namespace std;
int main(){
cout << "Di un numero decimale k, estraggo la parte intera, C, e un intero rappresentante le prime tre cifre della parte decimale, M.\nAd esempio:\nk=12345.6789 ---> C=12345 M=678" << endl;
double k;
int C, M;
cout << "Inserire il numero decimale k:" << endl;
cin >> k;
C=static_cast<int>(k);
M=static_cast<int>((k-C)*1000);
cout << "C=" << C << endl;
cout << "M=" << M << endl;
return 0;
}
Per la parte intera nessun problema con static_cast<int>
Per il secondo risultato ho pensato di sottrarre a tutto k la sua parte intera e moltiplicare 1000, poi riapplicare static_cast<int> a quest'ultimo numero.
Questo funziona per alcuni numeri, e per altri no!
Ad esempio, se io metto dentro k=12.24576 mi sputa correttamente M=245
Se invece metto dentro k=12.2 mi sputa 199, anziché 200.
Come mai?
Preciso che ho tentato con lo stesso codice rimuovendo gli static_cast, eseguendo i calcoli a parte, aggiungendo variabili per diluire... Ad esempio se dichiaro una variabile double t, dopo aver definito C, ed inserisco il calcolo e l'output
t=(k-C)*1000;
cout << "t=" << t << endl;
tutto funziona come dovrebbe, difatti se il risultato è un intero questo è giusto, altrimenti ovviamente mi dà anche delle cifre decimali, ma poi una volta che lo inserisco in questo modo
M=static_cast<int>(t);
questo inizia a dare problemi, in quanto tronca correttamente il numero se ha delle cifre decimali, ma se non ne ha spesso torna a dare il problema di prima (tornando agli esempi di qualche riga fa, se inserisco k=12.24576 mi dà t=245.76 e M=245, se inserisco k=12.2 mi dà t=200 e k=199).
Stessa cosa succede se provo a mettere al posto dell'ultima riga di codice citata
M=t;
Avrei davvero bisogno di aiuto, perché non riesco proprio a capire!
Grazie in anticipo.
Ps. Per aggirare il problema ho pensato di usare una struttura if... else, che usi static_cast quando t ha cifre decimali e che invece butti direttamente fuori t se è un intero. Può avere senso? E che espressione inserisco per esprimere questa cosa?