Pregunta

Estoy tratando de aprender a usar espacios de nombres declaraciones más definitivo que se limite a decir "using namespace std". Estoy tratando de dar formato a los datos de mi a 2 decimales, y establecer el formato a ser fija y no científica. Este es mi archivo principal:

#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 una razón para ello?

Además, no creo que me he fijado la parte fija o 2 decimales correctamente desde que parecen llegar notación científica vez he añadido el setprecision (2). Gracias.

¿Fue útil?

Solución

std::fixed (el otro simplemente inserta su valor en la corriente, por lo que se ve 8192), y no ve una llamada a std::setprecision en cualquier lugar en su código.
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';
}

Otros consejos

No podría ser 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. Usted puede ser mejor hacer el formateo de sí 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

Una mejor (?) Sin embargo, C ++ tiene una instalación llamada categoría de localización monetaria que incluye un dinero formateador centavos que tiene como argumento.

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 se acepta fracciones de un centavo. Desafortunadamente, esto no parece funcionar en mi sistema (Mac OS X), que tiene generalmente pobre soporte del local. (Linux y Windows deberían ir mejor.)

cout << setiosflags(ios::fixed) << setprecision(2) << 1/3.;

ios_base::fixed no está manipulador es un valor (1 << 13) para la bandera ios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top