формат, iomanip, c ++ - PullRequest
       3

формат, iomanip, c ++

7 голосов
/ 28 апреля 2010

Я пытаюсь научиться использовать декларации пространств имен более определенно, чем просто сказать "использование пространства имен std". Я пытаюсь отформатировать данные в 2 десятичных знака и установить фиксированный формат, а не научный. Это мой основной файл:

#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';
}

В Visual Studio 2008, когда я запускаю свою программу, я получаю «8192» перед данными, которые мне нужны. Есть ли причина для этого?

Кроме того, я не думаю, что правильно устанавливаю фиксированную часть или 2 десятичных знака, так как мне кажется, что я получил научную запись после добавления setprecision (2). Спасибо.

Ответы [ 3 ]

5 голосов
/ 28 апреля 2010

Вы хотите std::fixed (другой просто вставляет свое значение в поток, вот почему вы видите 8192), и я не вижу вызова std::setprecision в вашем коде где угодно.
Это исправим:

#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';
}
3 голосов
/ 28 апреля 2010

Возможно, это не тот ответ, который вы ищете, но числа с плавающей запятой не подходят для финансовых расчетов, потому что дроби типа 1/100 не могут быть представлены точно. Возможно, вам лучше сделать форматирование самостоятельно. Это может быть заключено в капсулу:

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

Еще лучше (?), В C ++ есть средство, называемое денежная языковая категория , которое включает средство форматирования денег , которое принимает в качестве аргумента центы.

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

Это должно сделать правильно на международном уровне, печатая местную валюту пользователя и скрывая количество десятичных знаков от вашей реализации. Он даже принимает доли цента. К сожалению, это, похоже, не работает в моей системе (Mac OS X), которая обычно имеет плохую поддержку локали. (Linux и Windows должны быть лучше.)

2 голосов
/ 28 апреля 2010
cout << setiosflags(ios::fixed) << setprecision(2) << 1/3.;

ios_base::fixed - это не манипулятор, это значение (1 << 13) для флага ios.

...