2010-04-28 5 views
7

Ich versuche zu lernen, Namespaces Deklarationen definitiver zu verwenden als nicht nur sagen "using namespace std". Ich versuche, meine Daten auf 2 Dezimalstellen zu formatieren, und setze das Format fest und nicht wissenschaftlich. Das ist meine Hauptdatei: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'; 
} 

auf Visual Studio 2008, als ich mein Programm laufen, ich eine Ausgabe von „8192“ erhalten, bevor die Daten, die ich will. Gibt es einen Grund dafür?

Außerdem glaube ich nicht, dass ich den festen Teil oder die 2 Dezimalstellen korrekt setze, da ich wissenschaftliche Schreibung zu bekommen scheint, sobald ich die eingestellte Präzision hinzugefügt habe (2). Vielen Dank.

Antwort

5

Sie möchten std::fixed (der andere fügt nur seinen Wert in den Stream, weshalb Sie 8192 sehen), und ich sehe keinen Anruf an std::setprecision in Ihrem Code überall.
Das wird es beheben:

#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 ist es nicht Manipulator ist ein Wert (1 << 13) für die ios Flagge.

3

Es ist nicht die Antwort sein könnte, nach dem Sie suchen, aber Gleitkommazahlen sind nicht auf finanzielle Berechnungen geeignet, da Fraktionen wie 1/100 nicht genau dargestellt werden kann. Sie könnten besser selbst die Formatierung durchführen. Dies kann eingekapselt werden: (?)

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 

Noch besser wäre es, C++ hat eine Einrichtung namens Geld locale Kategorie, die eine money formatter enthält, die Cent als Argument.

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

Dies sollte international das Richtige tun, den Druck der lokalen Währung des Benutzers und die Anzahl der Dezimalstellen von Ihrer Implementierung versteckt. Es akzeptiert sogar Bruchteile von Cent. Leider scheint dies nicht auf meinem System (Mac OS X) zu funktionieren, das generell schlechte Sprachunterstützung bietet. (Linux und Windows sollten besser laufen.)

+0

'money_put' Variante druckt' 123' statt '$ 1.23' auf meinem Rechner. Es sollte keine akzeptable Ausgabe für jedes Gebietsschema sein. – jfs

+0

@ J.F. - Die erwartete Ausgabe ist $ 1,23. Welche Plattform benutzen Sie? – Potatoswatter

+0

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