Jak w C++ (ewentualnie Qt/C++) zrobić coś takiego : mam liczbę typu double i użytkownik mi podaje ilość zer po przecinku (tej liczby) jaka ma byćwyświetlona. Np. mam liczbę : 3,1415926535 i uzytkownik podaje mi np. 4, wtedy wyświetlę tylko 3,1415. Jak to zrobić? Niestety nie mogę uzyć znanego z C prinftfa z opcją %f .. (ani printfa w ogóle)
Użyj cout i precision.
http://www.cplusplus.com/reference/iostream/ios_base/precision/
Super, chyba wystarczy jak na moje potrzeby :) Dzięki!
Jednak pojawił się problem : jak taką zmodyfikowaną liczbę o podanej dokładności np. zapisać do pliku? nie chodzi mi o fstream, bo wiem, jak pisac do pliku, ale czy jak zapisze do zmiennej, np. double to nie bede mial z powrotem tej samej liczby?
Hmmm, robisz (zakładam, że n
to precyzja, a num
to liczba):
- strumieniami:
stringstream ss;
ss << setprecision(n) << num;
ss.str(); //< string zawierający twoją liczbę z odpowiednią precyzją
- stdlibem:
char tab[100] = sprintf(sprintf("%%f%d", n), num);
Dla kodu :
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main(int argc, char **argv){
double liczba_pi = 3.1415926535;
double precyzja = 0;
cout << "Twoja liczba to: " << liczba_pi << endl;
cout << "Ile miejsc po przecinku wyswietlic?\n" << endl;
cin >> precyzja;
stringstream ss;
ss << precision(precyzja) << liczba_pi;
cout << "Twoja liczba z " << precyzja << " miejscami po przecinku " << ss.str() << endl;
cin.get();
return 0;''
}
Mam błędy:
G:\Untitled2.cpp: In function `int main(int, char**)':
G:\Untitled2.cpp:17: error: `precision' undeclared (first use this function)
G:\Untitled2.cpp:17: error: (Each undeclared identifier is reported only once for each function it appears in.)
G:\Untitled2.cpp:21:14: empty character constant
G:\Untitled2.cpp:23: error: expected `;' before '}' token
setprecision()
- nie precision()
;) http://www.cplusplus.com/reference/iostream/manipulators/setprecision/
''
masz na końcu (po return 0;
, to ten drugi błąd.
Po lekkiej zmianie i dodaniu zapisu do pliku :
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
int main(int argc, char **argv){
double liczba_pi = 3.1415926535;
double precyzja = 0;
ofstream plik("plik.txt");
cout << "Twoja liczba to: " << liczba_pi << endl;
cout << "Ile miejsc po przecinku wyswietlic?\n" << endl;
cin >> precyzja;
stringstream ss;
ss << setprecision()(precyzja) << liczba_pi;
cout << "Twoja liczba z " << precyzja << " miejscami po przecinku " << ss.str() << endl;
plik << "Liczba:\n";
plik << ss.str();
cin.get();
return 0;
}
Błędy:
G:\Untitled2.cpp: In function `int main(int, char**)':
G:\Untitled2.cpp:19: error: `setprecision' undeclared (first use this function)
G:\Untitled2.cpp:19: error: (Each undeclared identifier is reported only once for each function it appears in.)
Nagłówek iomanip
. Coś źle wywołujesz funkcję.
Jeszcze kilka zmian:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <string>
using namespace std;
int main(int argc, char **argv){
double liczba_pi = 3.1415926535;
double precyzja = 0;
ofstream plik("plik.txt");
cout << "Twoja liczba to: " << liczba_pi << endl;
cout << "Ile miejsc po przecinku wyswietlic?\n" << endl;
cin >> precyzja;
stringstream ss;
ss << setprecision(precyzja) << liczba_pi;
cout << "Twoja liczba z " << precyzja << " miejscami po przecinku " << ss.str() << endl;
plik << "Liczba:\n";
plik << ss.str();
plik.close();
cin.get();
cin.get();
return 0;
}
Warningi, co prawda, ale :
G:\Untitled2.cpp: In function `int main(int, char**)':
G:\Untitled2.cpp:20: warning: passing `double' for converting 1 of `std::_Setprecision std::setprecision(int)'
No i jak wpisze 3 liczby po przecinku, to wyświetla mi 3.14, a nie 3.141, a jak wpisze 4 po przecinku, to wyświetla 3.142 (jakby zaokrąglało)
Chyba już mam :
#include <iostream>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <string>
using namespace std;
int main(int argc, char **argv){
double liczba_pi = 3.1415926535;
int precyzja = 0;
ofstream plik("plik.txt");
cout << "Twoja liczba to: " << liczba_pi << endl;
cout << "Ile miejsc po przecinku wyswietlic?\n" << endl;
cin >> precyzja;
stringstream ss;
ss << setprecision(precyzja+1\) << liczba_pi;
cout << "Twoja liczba z " << precyzja << " miejscami po przecinku " << ss.str() << endl;
plik << "Liczba:\n";
plik << ss.str();
plik.close();
cin.get();
cin.get();
return 0;
}
Zajrzałeś do dokumentacji, którą podlinkowałem? smanip setprecision ( int n );
- argument to int
- a Ty podajesz double
.
edit. No właśnie. ;)
Dzięki wszystkim ;)
A jeszcze jedno pytanie mam: bo testowałem programik, i jeśli wpiszę do wyświetlenia większą ilość liczb po przecinku, niż liczba ma w rzeczywistości, to mi wyswietla dziwne liczby. Jak się przed tym zabezpieczyć? Czy da się sprawdzić, ile zapisana w zmiennej double liczba ma aktualnie miejsc po przecinku ? W moim wypadku chodzi mi o spr. ilość cyfr po przecinku zmiennej double liczba_pi.
Jakimś tam rozwiązaniem jest na pewno zmiana na ciąg znaków i liczenie cyfr po kropce, zastanawiam się tylko, czy nie ma po prostu łatwiejszego, szybszego sposobu?
możesz jeszcze tak:
double f= M_PI,f2; // twoja liczba
double d = 1000.0; // tym regulujesz ilosc miejsc po przecinku
f2 = round(f*d)/d;