6

「名前空間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」の出力が表示されます。その理由はありますか?

また、setprecision(2)を追加すると科学的記数法が得られるように見えるため、固定部分または小数点以下2桁を正しく設定しているとは思いません。ありがとう。

4

3 に答える 3

5

あなたが望む(もう一方はその値をストリームに挿入するだけなので、8192が表示されます)。コード内のどこにもstd::fixedへの呼び出しは表示されません。 これで修正されます: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';
}
于 2010-04-28T06:34:46.800 に答える
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 ++には、引数としてセントを受け取るマネーフォーマッターを含む通貨ロケールカテゴリと呼ばれる機能があります。

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

これは、ユーザーの現地通貨を印刷し、実装から小数点以下の桁数を非表示にして、国際的に正しいことを行う必要があります。1セントの端数も受け入れます。残念ながら、これは私のシステム(Mac OS X)では機能しないようです。これは一般的にロケールのサポートが不十分です。(LinuxとWindowsの方がうまくいくはずです。)

于 2010-04-28T06:39:21.727 に答える
2
cout << setiosflags(ios::fixed) << setprecision(2) << 1/3.;

ios_base::fixedマニピュレータではなく1 << 13、iosフラグの値()です。

于 2010-04-28T06:25:29.577 に答える