2011-09-29 11 views
7
double d = 1/2.; 
printf("%.2lf\n", d); 

To wypisuje 0.50. To właśnie chcę replikować za pomocą manipulatorów ostream. Jednak żaden z oczywistych manipulatorów iomanip nie pozwala mi ustawić minimalnych wymaganych miejsc dziesiętnych (jeśli dobrze zrozumiałem, setprecision ustawia maksymalną szerokość). Czy istnieje sposób, aby to zrobić w czystej postaci: iostream lub boost?Ekwiwalent ostream z% .2f lub% .2lf

Odpowiedz

3

Użyj setprecision w połączeniu z fixed.

Zgodnie z sekcją 22.4.2.2.2 normy, precyzyjne specyfikacje dla iostreamów mają dokładnie taki sam efekt jak dla printf. I fixed daje dokładnie takie samo zachowanie, jak printf 's %f.

+0

Czy możesz podać link? –

+0

@FooBah: Zobacz http://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or-c-standard-documents –

10

Można użyć std::fixed i std::setprecision z nagłówka iomanip:

#include <iostream> 
#include <iomanip> 
int main(void) { 
    double d = 1/2.; 
    std::cout << std::fixed << std::setprecision(2) << d << std::endl; 
    return 0; 
} 

ten wyprowadza 0.50 jako pożądane.

1
+2

Wow, to jest jak próba zabicia komara za pomocą termoatomowa głowica :-) – paxdiablo

+0

@paxdiable: Nie rozwiązuje prawdziwego problemu. 'printf' nie jest bezpiecznym typem (i działa z kilkoma typami), formatowanie strumieni jest bolesne (aw niektórych przypadkach absolutnie konieczne jest użycie ciągu formatującego). – visitor