2013-05-17 2 views
8

J'essaie de faire une sortie simple en texte formaté. Setprecision n'imprime pas mes variables avec deux décimales.C++ setprecision (2) impression d'une décimale?

Par exemple, si firstItemPrice = 2.20, la sortie est de 2,2 au lieu de 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

Votre code fonctionne très bien. Je l'ai compilé. Ça fonctionne bien. Il imprime deux décimales. Vous pourriez vouloir essayer un compilateur différent. –

Répondre

11

Vous avez besoin d'un fixed là-bas pour le faire.

cout << fixed; 

le remettre à l'aide:

cout.unsetf(ios_base::floatfield); 

Dans votre cas, en changeant le dernier bit de votre programme comme cet exemple devrait le faire:

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"; 

Editorial part: Ne pas utilisez des nombres à virgule flottante pour représenter les valeurs monétaires.

+0

pour savoir pourquoi float sont mauvais pour le calcul financier vérifier: http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency et http: // fr. wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries – fduff

+0

+1 pour l'éditorial sur le fait de ne pas utiliser le point flottant. – hochl

2

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

La précision à virgule flottante détermine le nombre maximal de chiffres à écrire sur les opérations d'insertion d'exprimer des valeurs en virgule flottante. La manière dont ceci est interprété dépend si l'indicateur de format floatfield est défini sur une notation spécifique (fixe ou scientifique) ou s'il est non défini (en utilisant la notation par défaut, qui n'est pas nécessairement équivalente à la notation fixe ou scientifique).

Pour l'environnement local par défaut: En utilisant la notation par défaut à virgule flottante, le champ de précision spécifie le nombre maximal de chiffres significatifs pour afficher dans le comptage total des deux personnes avant et celles après la virgule. Remarquez que ce n'est pas un minimum, et par conséquent il ne remplit pas le nombre affiché avec des zéros de fin si le nombre peut être affiché avec moins de chiffres que la précision. Dans les notations fixes et scientifiques, le champ de précision spécifie exactement le nombre de chiffres à afficher après la virgule décimale, même si cela inclut des zéros à virgule décimale. Les chiffres avant le point décimal ne sont pas pertinents pour la précision dans ce cas.