Dokładność liczby double

0

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)

0

Super, chyba wystarczy jak na moje potrzeby :) Dzięki!

0

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?

0

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);
0

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
0

setprecision() - nie precision() ;) http://www.cplusplus.com/reference/iostream/manipulators/setprecision/
'' masz na końcu (po return 0;, to ten drugi błąd.

0

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.)
0

Nagłówek iomanip. Coś źle wywołujesz funkcję.

0

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)

0

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;

}
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. ;)

0

Dzięki wszystkim ;)

0

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.

0

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?

0

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;

1 użytkowników online, w tym zalogowanych: 0, gości: 1