format,iomanip,c ++

时间:2010-04-28 06:02:25

标签: c++ iomanip

我正在努力学习使用命名空间声明比使用“使用命名空间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 个答案:

答案 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)。