2013-05-17 9 views
8

Sto provando a fare un po 'di output in testo formattato. Setprecision non stampa le mie variabili con due cifre decimali.C++ setprecision (2) stampa un decimale?

Per esempio, se firstItemPrice = 2.20, l'uscita è 2,2 invece di 2,20

#include <iostream> 
#include <iomanip> 
using namespace std; 

int main() 
{ 

    string firstitem = ""; 
    string seconditem = ""; 
    double firstItemNum;  
    double firstItemPrice = 0.00; 
    double secondItemNum; 
    double secondItemPrice = 0.00; 

    //first item 
    cout << "Enter the name of Item 1: "; 
    getline(cin, firstitem); 
    cout << "Enter the number of " << firstitem << "s and the price of each: "; 
    cin >> firstItemNum >> firstItemPrice; 
    cin.ignore(); 

    //second item 
    cout << "Enter the name of Item 2: "; 
    getline(cin, seconditem); 
    cout << "Enter the number of " << seconditem << "s and the price of each: "; 
    cin >> secondItemNum >> secondItemPrice; 


    cout << left << setw(20) << "Item" << setw(10) << "Count" 
    << setw(10) << "Price" << left << "\n"; 

    cout << setw(20) << "====" << setw(10) << "====" << setw(10) 
    << "====" << left << "\n"; 

    cout << setw(20) << firstitem << setw(10) 
    << firstItemNum << setw(10) << setprecision(2) 
    << firstItemPrice << "\n"; 

    cout << setw(20) << seconditem << setw(10) << secondItemNum 
    << setprecision(2) << secondItemPrice << left << "\n"; 


    return 0; 
} 
+0

Il tuo codice è a posto. L'ho compilato. Funziona bene. Stampa due decimali. Potresti voler provare un compilatore diverso. –

risposta

11

Hai bisogno di un fixed lì per farlo.

cout << fixed; 

Set indietro utilizzando:

cout.unsetf(ios_base::floatfield); 

Nel tuo caso, cambiando l'ultimo pezzo del programma come questo esempio dovrebbe farlo:

cout << setw(20) << firstitem << setw(10) 
<< firstItemNum << setw(10) << fixed << setprecision(2) 
<< firstItemPrice << "\n"; 

cout.unsetf(ios_base::floatfield); 

cout << setw(20) << seconditem << setw(10) << secondItemNum 
<< fixed << setprecision(2) << secondItemPrice << left << "\n"; 

editoriale da parte: non fare utilizzare i numeri in virgola mobile per rappresentare i valori di valuta.

+0

per scoprire perché il float è negativo per il calcolo del calcolo finanziario: http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency e http: // en. wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries – fduff

+0

+1 per l'editoriale sul non utilizzo di virgola mobile. – hochl

2

da http://www.cplusplus.com/reference/ios/ios_base/precision/

La precisione a virgola mobile determina il numero massimo di cifre da scrivere su operazioni di inserimento di esprimere valori in virgola mobile. Il modo in cui questo viene interpretato dipende dal fatto che il flag di formato floatfield sia impostato su una notazione specifica (fissa o scientifica) o non impostata (utilizzando la notazione predefinita, che non è necessariamente equivalente a quella fissa o scientifica).

Per la localizzazione predefinita: Uso notazione a virgola mobile default, il campo precisione specifica il numero massimo di cifre significative da visualizzare nel conteggio totale sia quelli prima e quelle dopo la virgola. Si noti che non è un minimo, e quindi non riempie il numero visualizzato con zeri finali se il numero può essere visualizzato con meno cifre rispetto alla precisione. In entrambe le notazioni fisse e scientifiche, il campo precisione specifica esattamente quante cifre visualizzare dopo il punto decimale, anche se questo include gli zeri decimali finali. Le cifre prima del punto decimale non sono rilevanti per la precisione in questo caso.