Я пытаюсь учиться использовать объявления пространств имен, более категоричные, чем не, только говорят "станд. пространства имен использования". Я пытаюсь отформатировать свои данные к 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, когда я запускаю свою программу, я получаю вывод "8 192" перед данными, которые я хочу. Существует ли причина этого?
Кроме того, я не думаю, что устанавливаю фиксированную часть или 2 десятичных разряда правильно, так как я, кажется, получаю экспоненциальное представление, после того как я добавил setprecision (2).Спасибо.
Вы хотите 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';
}
cout << setiosflags(ios::fixed) << setprecision(2) << 1/3.;
ios_base :: fixed
не является манипулятором, это значение ( 1 << 13
) для флага ios.
Возможно, это не тот ответ, который вы ищете, но числа с плавающей запятой не подходят для финансовых расчетов, потому что дроби, такие как 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 должны работать лучше.)