2010-04-28 14 views
7

Sto cercando di imparare a usare le dichiarazioni dei namespace più definitive di quelle che non dico "using namespace std". Sto cercando di formattare i miei dati in 2 cifre decimali e di impostare il formato in modo fisso e non scientifico. Questo è il mio file principale: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'; 
} 

su Visual Studio 2008, quando eseguo il mio programma, ottengo un output di "8192" prima che i dati che voglio. C'è una ragione per questo?

Inoltre, non penso di impostare correttamente la parte fissa o 2 cifre decimali poiché mi sembra di ottenere la notazione scientifica una volta aggiunta la setprecision (2). Grazie.

risposta

5

Si desidera std::fixed (l'altro inserisce il suo valore nel flusso, motivo per cui si vede 8192), e non vedo una chiamata al numero std::setprecision nel proprio codice.
Questo sarà risolvere il problema:

#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 non manipolatore che è un valore (1 << 13) per il flag ios.

3

Potrebbe non essere la risposta che state cercando, ma numeri in virgola mobile non sono adatti ai calcoli finanziari perché le frazioni come 1/100 non possono essere rappresentati esattamente. Potrebbe essere meglio fare da solo la formattazione. Questo può essere incapsulato: (?)

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 

Meglio ancora, C++ ha una struttura chiamata la categoria locale monetaria che comprende una money formatter che prende centesimi come argomento.

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

questo dovrebbe fare la cosa giusta a livello internazionale, la stampa di valuta locale dell'utente e nascondere il numero di cifre decimali dal implementazione. Accetta anche frazioni di un centesimo. Sfortunatamente, questo non sembra funzionare sul mio sistema (Mac OS X), che ha generalmente un supporto locale scarso. (Linux e Windows dovrebbero andare meglio.)

+0

La variante 'money_put' stampa' 123' invece di '$ 1,23' sulla mia macchina. Non dovrebbe essere accettabile in uscita in nessuna lingua. – jfs

+0

@ J.F. - L'uscita prevista è '$ 1,23'. Che piattaforma stai usando? – Potatoswatter

+0

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