我正在努力学习使用命名空间声明比使用“使用命名空间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),我似乎得到了科学记数法。感谢。
答案 0 :(得分:5)
你想要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';
}
答案 1 :(得分:3)
它可能不是您正在寻找的答案,但浮点数不适合财务计算,因为像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 ++有一个名为货币区域设置类别的工具,其中包含money formatter,以美分为参数。
locale::global( locale("") );
use_facet< money_put<char> >( locale() ).put( cout, false, cout, ' ', 123 );
这应该在国际上做正确的事情,打印用户的本地货币并隐藏实现中的小数位数。它甚至可以接受一分钱。不幸的是,这似乎不适用于我的系统(Mac OS X),它通常支持很差的语言环境。 (Linux和Windows应该更好。)
答案 2 :(得分:2)
cout << setiosflags(ios::fixed) << setprecision(2) << 1/3.;
ios_base::fixed
不是操纵者,它是ios标志的值(1 << 13
)。