2010-04-28 6 views
7

J'essaie d'apprendre à utiliser des déclarations d'espaces de noms plus définitives que de simplement dire "using namespace std". J'essaie de formater mes données à 2 décimales, et de définir le format à corriger et non scientifique. Ceci est mon fichier principal:format, iomanip, C++

#include <iostream> 
#include <iomanip> 

#include "SavingsAccount.h" 
using std::cout; 
using std::setprecision; 
using std::ios_base; 

int main() 
{ 
    SavingsAccount *saver1 = new SavingsAccount(2000.00); 
    SavingsAccount *saver2 = new SavingsAccount(3000.00); 

    SavingsAccount::modifyInterestRate(.03); 

    saver1->calculateMonthlyInterest(); 
    saver2->calculateMonthlyInterest(); 

    cout << ios_base::fixed << "saver1\n" << "monthlyInterestRate: " << saver1->getMonthlyInterest() 
     << '\n' << "savingsBalance: " << saver1->getSavingsBalance() << '\n'; 
    cout << "saver2\n" << "monthlyInterestRate: " << saver2->getMonthlyInterest() 
     << '\n' << "savingsBalance: " << saver2->getSavingsBalance() << '\n'; 
} 

sur Visual Studio 2008, quand je lance mon programme, je reçois une sortie de « 8192 » avant que les données que je veux. Y at-il une raison à cela?

En outre, je ne pense pas que je mets la partie fixe ou 2 décimales correctement puisque je semble obtenir la notation scientifique une fois que j'ai ajouté le setprecision (2). Merci.

Répondre

5

Vous voulez std::fixed (l'autre insère juste sa valeur dans le flux, ce qui explique pourquoi vous voyez 8192), et je ne vois pas un appel à std::setprecision dans votre code n'importe où.
Ça va fixer:

#include <iostream> 
#include <iomanip> 

using std::cout; 
using std::setprecision; 
using std::fixed; 

int main() 
{ 
    cout << fixed << setprecision(2) 
     << "saver1\n" 
     << "monthlyInterestRate: " << 5.5 << '\n' 
     << "savingsBalance: " << 10928.8383 << '\n'; 
    cout << "saver2\n" 
     << "monthlyInterestRate: " << 4.7 << '\n' 
     << "savingsBalance: " << 22.44232 << '\n'; 
} 
2
cout << setiosflags(ios::fixed) << setprecision(2) << 1/3.; 

ios_base::fixed est manipulateur pas est une valeur (1 << 13) pour l'indicateur ios.

3

Il pourrait ne pas être la réponse que vous cherchez, mais les nombres à virgule flottante ne sont pas adaptés à des calculs financiers en raison des fractions comme ne peuvent pas être 1/100 représentés exactement. Vous feriez mieux de faire le formatage vous-même. Cela peut être encapsulé: (?)

class money { 
    int cents; 
public: 
    money(int in_cents) : cents(in_cents) {} 

    friend ostream &operator<< (ostream &os, money const &rhs) 
     { return os << '$' << m.cents/100 << '.' << m.cents % 100; } 
}; 

cout << money(123) << endl; // prints $1.23 

Mieux encore, C++ est une installation appelée la catégorie locale monétaire qui comprend une money formatter qui prend cents comme argument.

locale::global(locale("")); 
use_facet< money_put<char> >(locale()).put(cout, false, cout, ' ', 123); 

Cela devrait faire la bonne chose au niveau international, l'impression monnaie locale de l'utilisateur et cacher le nombre de décimales de votre mise en œuvre. Il accepte même des fractions de cent. Malheureusement, cela ne semble pas fonctionner sur mon système (Mac OS X), qui a généralement un mauvais support des paramètres régionaux. (Linux et Windows devraient s'en tirer mieux.)

+0

La variante 'money_put' imprime' 123' au lieu de '$ 1,23' sur ma machine. Cela ne devrait pas être une sortie acceptable pour n'importe quel environnement local. – jfs

+0

@ J.F. - La production attendue est de 1,23 $. Quelle plateforme utilises-tu? – Potatoswatter

+0

@Potatoswatter: http://codepad.org/EY5PqSIw – jfs