2013-01-21 11 views
11

W jaki sposób sformatować zmienną w C++, aby wyprowadzić do dwóch miejsc dziesiętnych zaokrąglonych w górę? Nie mam szczęścia z setw i setprecision, ponieważ mój kompilator po prostu mówi mi, że są not defined.Formatowanie zmiennoprzecinkowe C++

cout << "Total : " << setw(2) << total << endl;

całkowite wyjścia: Total : 12.3961

Chciałabym to być: 12.40 lub 12.39 jeśli jest zbyt wiele pracy, aby zaokrąglić w górę.

+1

Pokaż nam kod. – 0x499602D2

+0

Mój zły, zapomniałem go i zredagowałem. – eveo

Odpowiedz

12

Trzeba to <iomanip> i zapewniają zakres przestrzeni nazw do setw and setprecision

#include <iomanip> 
std::setw(2) 
std::setprecision(5) 

try:

cout.precision(5); 
cout << "Total : " << setw(4) << floor(total*100)/100 << endl; 

lub

cout << "Total : " << setw(4) << ceil(total*10)/10 << endl; 

iostream zapewnia funkcję precyzyjnej, ale używać setw, ty może być konieczne dołączenie dodatkowego pliku nagłówkowego.

+0

Czy nie ma innych sposobów na jego formatowanie bez dołączania innych bibliotek?Pytam o to, ponieważ mój profesor jest bardzo surowy i zakładam, że nie chce, żebyśmy badali więcej bibliotek niż te, których nauczyliśmy się w klasie aka 'iostream' i' cstring'. – eveo

+0

'setprecision (2)' wyświetla '12', a nie' 12.39'. Jak wyświetlić miejsca dziesiętne? – eveo

+0

@eveo '' jest częścią standardowej biblioteki C++. Dobry profesor nie powinien zabraniać ci odkrywania Internetu na temat dobrych rozwiązań. Jeśli możesz wyjaśnić, dlaczego zawarłeś inny plik * standardowej biblioteki * (to nie jest kolejna * biblioteka *), to powinno być idealnie w porządku. – leemes

2

Jeśli chcesz, aby końcowe zero było zaokrąglane, możesz użyć funkcji C printf.

#include <iostream> 
#include <cstdio> 

int main() { 
    float v = 12.3961; 
    std::printf("%.2f",v); //prints 12.40 
} 

porównaniu do:

#include <iostream> 
#include <iomanip> 

int main() { 
    float v = 12.3961; 
    std::cout << std::setprecision(4) << v; //prints 12.4 
} 
+0

To nie odpowiada na pytanie, prawda? – leemes

+0

@ stara się zapytać, jak uzyskać sformatowane wyjście precyzji. Czy on nie jest? Przynajmniej to czytam. – Rapptz

+0

Hmm ... Myślę, że to był mój błąd. Twoja odpowiedź jest poprawna. Jednak nie podoba mi się, że chcesz powrócić do funkcji C, takiej jak 'printf'. A twoje rozwiązanie C++ nie drukuje poprawnego wyniku, tak jak chciał (z końcowym 0). [Przy okazji: powiedziałeś, że prowadzisz zamiast trailing] – leemes

8

że również spływu zera, nie jest wystarczająca, aby ustawić precyzję. Trzeba też zmienić formacie zmiennoprzecinkowym do ustalonym formacie, który wykorzystuje liczbę cyfr, jak powiedział przez setprecision jako liczba cyfr po przecinku:

std::cout << std::fixed << std::setprecision(2) << v; 

Working online example code

+3

Aby to działało, musisz dodać to do swoich obejmuje: #include Allen

12

użytku cout << fixed lub cout.setf(ios::fixed) i std::cout.precision(<# of decimal digits>) jak w następujący (przy użyciu Clang-503.0.40 kompilator dołączone OSX Indywidualistów)

#include <iostream> 
using namespace std; // Hopefully this doesn't offend purists :-) 
         // I just want to demonstrate usage with the 
         // fewest keystrokes and the clearest format 

int main() 
{ 
    float loge = 2.718; 
    double fake = 1234567.818; 
    cout << fixed; 
    cout.precision(2); 
    cout << "loge(2) = " << loge << endl; 
    cout << "fake(2) = " << fake << endl; 
    cout.precision(3); 
    cout << "loge(3) = " << loge << endl; 
    cout << "fake(3) = " << fake << endl; 
} 

Wyjście z tego jest (uwaga zaokrąglenia):

loge(2) = 2.72 
fake(2) = 1234567.82 
loge(3) = 2.718 
fake(3) = 1234567.818 

Jest to prosta wersja. Zamiast używania cout << fixed;, można użyć cout.setf(ios::fixed); (do wyświetlania notacji naukowej, zastąpić ustaloną z naukową, obie ustawią liczbę cyfr po prawej stronie przecinka dziesiętnego). Zauważ, że cout.precision() jest również używany do ustawiania liczby cyfr wyświetlanych łącznie po obu stronach kropki dziesiętnej, jeśli flagi formatu nie zawierają ustalonego lub naukowego. Dostępne są tutoriale do tego w Internecie.