2010-04-28 17 views
7

Estoy tratando de aprender a usar declaraciones de espacios de nombres más definitivas que las que dicen "using namespace std". Estoy tratando de formatear mis datos a 2 decimales, y establecer el formato para ser fijo y no científico. Este es mi archivo 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'; 
} 

En Visual Studio 2008, cuando ejecuto mi programa, me sale una producción de "8192" antes de los datos que quiero. ¿Hay alguna razón para eso?

Además, no creo que establezca la parte fija o 2 decimales correctamente ya que parece que tengo notación científica una vez que agregué la precisión (2). Gracias.

Respuesta

5

¿Quieres std::fixed (el otro simplemente inserta su valor en la corriente, por lo que se ve 8192), y no veo una llamada a std::setprecision en su código en cualquier lugar.
Esto va a solucionarlo:

#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 no se manipulador que es un valor (1 << 13) para la bandera ios.

3

Puede que no sea la respuesta que está buscando, pero los números de punto flotante no son adecuados para los cálculos financieros porque fracciones como 1/100 no se pueden representar con exactitud. Puede ser mejor que hagas el formateo tú mismo. Esto puede ser encapsulado: (?)

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 

Mejor aún, C++ tiene una instalación de la categoría llamada local monetaria que incluye un money formatter que toma como argumento centavos.

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

Esto debería hacer lo correcto a nivel internacional, la impresión de la moneda local del usuario y ocultar el número de decimales de su aplicación. Incluso acepta fracciones de un centavo. Desafortunadamente, esto no parece funcionar en mi sistema (Mac OS X), que generalmente tiene poca compatibilidad con la configuración regional. (Linux y Windows deberían funcionar mejor.)

+0

La variante 'money_put' imprime' 123' en lugar de '$ 1.23' en mi máquina. No debería ser una salida aceptable en cualquier localidad. – jfs

+0

@ J.F. - El resultado esperado es '$ 1.23'. ¿Qué plataforma estás usando? – Potatoswatter

+0

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